Walkthrough: Retrieving Dialog Box Information Collectively Using Objects
Most Windows Forms dialog boxes have properties that expose information to the parent form. Rather than create multiple properties, you can expose a group of related data through a single dialog box property by creating a class object that stores all of the information needed by the parent form.
The following walkthrough creates a dialog box that exposes a UserInformation
property containing name and e-mail address data, which is available to the parent form even after the dialog box is closed.
To create a dialog box that will expose its data through an object
In Visual Studio, create a new Windows Forms project called DialogBoxObjects. For more information, see How to: Create a Windows Application Project.
Add a new Form to the project and name it InformationForm. For more information, see How to: Add Windows Forms to a Project.
From the Toolbox, drag a TableLayoutPanel onto the form. Use the smart tag that appears as an arrow next to the control to add a third row to the table, and use the mouse to resize the rows so that all three are equal.
Add a Label to each table cell in the first column, and a TextBox to each cell in the second column. The Label controls should be named, from top to bottom, firstNameLabel, lastNameLabel, and emailLabel; the TextBox controls should be named firstNameText, lastNameText, and emailText. When you are finished, add a Button control. Name it okButton, and change the Text property to OK.
Add a new Class file named
UserInformation
to the project.Add the public qualifier to the class definition to make this class visible outside of its namespace, and add property definitions for the
FirstName
,LastName
andEmailAddress
properties. When you are finished, the code should look like this:
Public Class UserInformation
Private _FirstName As String = ""
Private _LastName As String = ""
Private _EmailAddress As String = ""
Public Property FirstName() As String
Get
Return _FirstName
End Get
Set(ByVal value As String)
_FirstName = value
End Set
End Property
Public Property LastName() As String
Get
Return _LastName
End Get
Set(ByVal value As String)
_LastName = value
End Set
End Property
Public Property EmailAddress() As String
Get
Return _EmailAddress
End Get
Set(ByVal value As String)
_EmailAddress = value
End Set
End Property
End Class
using System;
using System.Collections.Generic;
using System.Text;
namespace DialogBoxObjects
{
public class UserInformation
{
private string _firstName = "";
private string _lastName = "";
private string _emailAddress = "";
public string FirstName
{
get
{
return (_firstName);
}
set
{
_firstName = value;
}
}
public string LastName
{
get
{
return (_lastName);
}
set
{
_lastName = value;
}
}
public string EmailAddress
{
get
{
return (_emailAddress);
}
set
{
_emailAddress = value;
}
}
}
}
using namespace System;
using namespace System::Collections::Generic;
using namespace System::Text;
namespace DialogBoxObjects
{
public ref class UserInformation
{
public:
UserInformation()
{
firstNameValue = "";
lastNameValue = "";
emailAddressValue = "";
}
private:
String^ firstNameValue;
private:
String^ lastNameValue;
private:
String^ emailAddressValue;
public:
property String^ FirstName
{
String^ get()
{
return firstNameValue;
}
void set( String^ value )
{
firstNameValue = value;
}
}
public:
property String^ LastName
{
String^ get()
{
return lastNameValue;
}
void set( String^ value )
{
lastNameValue = value;
}
}
public:
property String^ EmailAddress
{
String^ get()
{
return emailAddressValue;
}
void set( String^ value )
{
emailAddressValue = value;
}
}
};
}
- Go back to the code for InformationForm, and add a
UserInformation
property.
Public ReadOnly Property UserInformation() As UserInformation
Get
Return _UI
End Get
End Property
public UserInformation UserInformation
{
get
{
return (_ui);
}
}
public:
property DialogBoxObjects::UserInformation^ UserInformation
{
DialogBoxObjects::UserInformation^ get()
{
return this->userInformation;
}
}
- Handle the Validated event on each of the TextBox controls so that you can update the corresponding property on
UserInformation
whenever one of the values change.
Private Sub FirstNameText_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles FirstNameText.Validated
Dim FirstNameTemp As String = FirstNameText.Text.Trim()
If FirstNameText.Text.Trim().Length > 0 Then
_UI.FirstName = FirstNameTemp
End If
End Sub
Private Sub LastNameText_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles LastNameText.Validated
Dim LastNameTemp As String = LastNameText.Text.Trim()
If LastNameText.Text.Trim().Length > 0 Then
_UI.LastName = LastNameTemp
End If
End Sub
Private Sub EmailText_Validated(ByVal sender As Object, ByVal e As EventArgs) Handles EmailText.Validated
Dim EmailTemp As String = EmailText.Text.Trim()
If EmailTemp.Length > 0 Then
_UI.EmailAddress = EmailTemp
End If
End Sub
public InformationForm()
{
InitializeComponent();
firstNameText.Validated += new EventHandler(firstNameText_Validated);
lastNameText.Validated += new EventHandler(lastNameText_Validated);
emailText.Validated += new EventHandler(emailText_Validated);
}
void firstNameText_Validated(object sender, EventArgs e)
{
string firstNameTemp = firstNameText.Text.Trim();
if (firstNameText.Text.Trim().Length > 0)
{
_ui.FirstName = firstNameTemp;
}
}
void lastNameText_Validated(object sender, EventArgs e)
{
string lastNameTemp = lastNameText.Text.Trim();
if (lastNameText.Text.Trim().Length > 0)
{
_ui.LastName = lastNameTemp;
}
}
void emailText_Validated(object sender, EventArgs e)
{
string emailTemp = emailText.Text.Trim();
if (emailTemp.Length > 0)
{
_ui.EmailAddress = emailTemp;
}
}
private:
void FirstNameText_Validated(Object^ sender, EventArgs^ e)
{
String^ firstName = firstNameText->Text->Trim();
if (firstName->Length > 0)
{
userInformation->FirstName = firstName;
}
}
private:
void LastNameText_Validated(Object^ sender, EventArgs^ e)
{
String^ lastName = lastNameText->Text->Trim();
if (lastName->Length > 0)
{
userInformation->LastName = lastName;
}
}
private:
void EmailText_Validated(Object^ sender, EventArgs^ e)
{
String^ email = emailText->Text->Trim();
if (email->Length > 0)
{
userInformation->EmailAddress = email;
}
}
private:
void CloseFormButton_Click(Object^ sender, EventArgs^ e)
{
if (userInformation->FirstName->Length == 0)
{
MessageBox::Show("First name cannot be zero-length.");
return;
}
if (userInformation->LastName->Length == 0)
{
MessageBox::Show("Last name cannot be zero-length.");
return;
}
if (userInformation->EmailAddress->Length == 0)
{
MessageBox::Show("Email address cannot be zero-length.");
return;
}
this->DialogResult = ::DialogResult::OK;
this->Hide();
}
#pragma region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private:
void InitializeComponent()
{
this->tableLayoutPanel1 =
gcnew System::Windows::Forms::TableLayoutPanel();
this->firstNameLabel = gcnew System::Windows::Forms::Label();
this->lastNameLabel = gcnew System::Windows::Forms::Label();
this->emailLabel = gcnew System::Windows::Forms::Label();
this->firstNameText = gcnew System::Windows::Forms::TextBox();
this->lastNameText = gcnew System::Windows::Forms::TextBox();
this->emailText = gcnew System::Windows::Forms::TextBox();
this->closeFormButton = gcnew System::Windows::Forms::Button();
this->tableLayoutPanel1->SuspendLayout();
this->SuspendLayout();
//
// tableLayoutPanel1
//
this->tableLayoutPanel1->ColumnCount = 2;
this->tableLayoutPanel1->ColumnStyles->Add(
gcnew System::Windows::Forms::ColumnStyle(
System::Windows::Forms::SizeType::Percent, 33.98533F));
this->tableLayoutPanel1->ColumnStyles->Add(
gcnew System::Windows::Forms::ColumnStyle(
System::Windows::Forms::SizeType::Percent, 66.01467F));
this->tableLayoutPanel1->Controls->Add(this->firstNameLabel, 0, 0);
this->tableLayoutPanel1->Controls->Add(this->lastNameLabel, 0, 1);
this->tableLayoutPanel1->Controls->Add(this->emailLabel, 0, 2);
this->tableLayoutPanel1->Controls->Add(this->firstNameText, 1, 0);
this->tableLayoutPanel1->Controls->Add(this->lastNameText, 1, 1);
this->tableLayoutPanel1->Controls->Add(this->emailText, 1, 2);
this->tableLayoutPanel1->Location = System::Drawing::Point(33, 30);
this->tableLayoutPanel1->Name = "tableLayoutPanel1";
this->tableLayoutPanel1->RowCount = 3;
this->tableLayoutPanel1->RowStyles->Add(
gcnew System::Windows::Forms::RowStyle(
System::Windows::Forms::SizeType::Percent, 50.0F));
this->tableLayoutPanel1->RowStyles->Add(
gcnew System::Windows::Forms::RowStyle(
System::Windows::Forms::SizeType::Percent, 50.0F));
this->tableLayoutPanel1->RowStyles->Add(
gcnew System::Windows::Forms::RowStyle(
System::Windows::Forms::SizeType::Absolute, 41.0F));
this->tableLayoutPanel1->Size = System::Drawing::Size(658, 116);
this->tableLayoutPanel1->TabIndex = 0;
//
// firstNameLabel
//
this->firstNameLabel->Anchor =
System::Windows::Forms::AnchorStyles::None;
this->firstNameLabel->AutoSize = true;
this->firstNameLabel->Location = System::Drawing::Point(82, 11);
this->firstNameLabel->Name = "firstNameLabel";
this->firstNameLabel->Size = System::Drawing::Size(59, 14);
this->firstNameLabel->TabIndex = 0;
this->firstNameLabel->Text = "First Name";
//
// lastNameLabel
//
this->lastNameLabel->Anchor =
System::Windows::Forms::AnchorStyles::None;
this->lastNameLabel->AutoSize = true;
this->lastNameLabel->Location = System::Drawing::Point(82, 48);
this->lastNameLabel->Name = "lastNameLabel";
this->lastNameLabel->Size = System::Drawing::Size(59, 14);
this->lastNameLabel->TabIndex = 1;
this->lastNameLabel->Text = "Last Name";
//
// emailLabel
//
this->emailLabel->Anchor =
System::Windows::Forms::AnchorStyles::None;
this->emailLabel->AutoSize = true;
this->emailLabel->Location = System::Drawing::Point(73, 88);
this->emailLabel->Name = "emailLabel";
this->emailLabel->Size = System::Drawing::Size(77, 14);
this->emailLabel->TabIndex = 2;
this->emailLabel->Text = "Email Address";
//
// firstNameText
//
this->firstNameText->Anchor =
System::Windows::Forms::AnchorStyles::None;
this->firstNameText->Location = System::Drawing::Point(339, 8);
this->firstNameText->Name = "firstNameText";
this->firstNameText->Size = System::Drawing::Size(203, 20);
this->firstNameText->TabIndex = 3;
//
// lastNameText
//
this->lastNameText->Anchor =
System::Windows::Forms::AnchorStyles::None;
this->lastNameText->Location = System::Drawing::Point(339, 45);
this->lastNameText->Name = "lastNameText";
this->lastNameText->Size = System::Drawing::Size(202, 20);
this->lastNameText->TabIndex = 4;
//
// emailText
//
this->emailText->Anchor =
System::Windows::Forms::AnchorStyles::None;
this->emailText->Location = System::Drawing::Point(336, 85);
this->emailText->Name = "emailText";
this->emailText->Size = System::Drawing::Size(208, 20);
this->emailText->TabIndex = 5;
//
// closeFormButton
//
this->closeFormButton->Location = System::Drawing::Point(550, 211);
this->closeFormButton->Name = "closeFormButton";
this->closeFormButton->Size = System::Drawing::Size(141, 23);
this->closeFormButton->TabIndex = 1;
this->closeFormButton->Text = "OK";
this->closeFormButton->Click += gcnew System::EventHandler(this,
&InformationForm::CloseFormButton_Click);
//
// InformationForm
//
this->AutoScaleDimensions = System::Drawing::SizeF(6.0F, 13.0F);
this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
this->ClientSize = System::Drawing::Size(744, 258);
this->Controls->Add(this->closeFormButton);
this->Controls->Add(this->tableLayoutPanel1);
this->Name = "InformationForm";
this->Text = "User Information";
this->tableLayoutPanel1->ResumeLayout(false);
this->tableLayoutPanel1->PerformLayout();
this->ResumeLayout(false);
}
#pragma endregion
public:
InformationForm()
{
userInformation = gcnew DialogBoxObjects::UserInformation;
components = nullptr;
InitializeComponent();
firstNameText->Validated += gcnew EventHandler
(this, &InformationForm::FirstNameText_Validated);
lastNameText->Validated += gcnew EventHandler(this,
&InformationForm::LastNameText_Validated);
emailText->Validated += gcnew EventHandler(this,
&InformationForm::EmailText_Validated);
}
- Add handlers for the Validated event to each of the TextBox controls on your form, so that the new value of these controls is assigned to
UserInformation
whenever the user changes them.
Private Sub closeFormButton_Click(ByVal sender As Object, ByVal e As EventArgs)
If _UI.FirstName.Length = 0 Then
MessageBox.Show("First name cannot be zero-length.")
Exit Sub
End If
If _UI.LastName.Length = 0 Then
MessageBox.Show("Last name cannot be zero-length.")
Exit Sub
End If
If _UI.EmailAddress.Length = 0 Then
MessageBox.Show("Email address cannot be zero-length.")
Exit Sub
End If
Me.DialogResult = System.Windows.Forms.DialogResult.OK
Me.Close()
End Sub
private void closeFormButton_Click(object sender, EventArgs e)
{
if (_ui.FirstName.Length == 0)
{
MessageBox.Show("First name cannot be zero-length.");
return;
}
if (_ui.LastName.Length == 0)
{
MessageBox.Show("Last name cannot be zero-length.");
return;
}
if (_ui.EmailAddress.Length == 0)
{
MessageBox.Show("Email address cannot be zero-length.");
return;
}
this.DialogResult = DialogResult.OK;
this.Hide();
}
private:
void CloseFormButton_Click(Object^ sender, EventArgs^ e)
{
if (userInformation->FirstName->Length == 0)
{
MessageBox::Show("First name cannot be zero-length.");
return;
}
if (userInformation->LastName->Length == 0)
{
MessageBox::Show("Last name cannot be zero-length.");
return;
}
if (userInformation->EmailAddress->Length == 0)
{
MessageBox::Show("Email address cannot be zero-length.");
return;
}
this->DialogResult = ::DialogResult::OK;
this->Hide();
}
To show the dialog box you created and retrieve the data using an object
Select Form1 in Visual Studio. Add a Button to the form, and changes its Name property to showFormButton.
Double-click the button to add an event handler that calls the dialog box and displays the results.
Private Sub ShowFormButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ShowFormButton.Click
Dim InfoForm As New InformationForm()
Dim dr As DialogResult = InfoForm.ShowDialog()
If dr = System.Windows.Forms.DialogResult.OK Then
Dim Txt As String = "First Name: " & InfoForm.UserInformation.FirstName + ControlChars.Cr + ControlChars.Lf
Txt &= "Last Name: " & InfoForm.UserInformation.LastName + ControlChars.Cr + ControlChars.Lf
Txt &= "Email Address: " & InfoForm.UserInformation.EmailAddress
MessageBox.Show(Txt)
End If
InfoForm.Dispose()
End Sub
See Also
Tasks
How to: Create Dialog Boxes at Design Time
How to: Close Dialog Boxes and Retain User Input
How to: Retrieve Dialog Box Information Selectively Using Multiple Properties