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 New Windows Forms 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 InformationForm form.
Use the smart tag that appears as an arrow next to the TableLayoutPanel control to add a third row to the table.
Use the mouse to resize the rows so that all three rows are equal.
From the Toolbox, drag a Label to each table cell in the first column.
Set the Name property of the Label controls to firstNameLabel, lastNameLabel, and emailLabel.
Set the Text property of the controls to First Name, Last Name, and Email.
From the Toolbox, drag a TextBox to each cell in the second column.
Set the Name property of the TextBox controls to firstNameText, lastNameText, and emailText.
From the Toolbox, drag a Button control onto the form.
Add a new class file named UserInformation to the project.
For a C# project, add the public qualifier to the class definition to make this class visible outside of its namespace.
In the UserInformation class, add property definitions for the FirstName, LastName and EmailAddress 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; } } }; }
In Solution Explorer, right-click InformationForm and select View Code.
In the code-behind page for InformationForm, enter the following code in the InformationForm class to add a UserInformation property.
Private _UI As New UserInformation() Public ReadOnly Property UserInformation() As UserInformation Get Return _UI End Get End Property
UserInformation _ui = new UserInformation(); public UserInformation UserInformation { get { return (_ui); } }
public: property DialogBoxObjects::UserInformation^ UserInformation { DialogBoxObjects::UserInformation^ get() { return this->userInformation; } }
In the InformationForm class, add a Validated event handler for each of the TextBox controls.
In the event handler code, update the corresponding property of the UserInformation class whenever the TextBox value changes, as shown in the following code. For more information, see How to: Create Event Handlers Using the Designer.
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); }
In the InformationForm class, add a Click event handler for the closeFormButton control.
In the event handler code, validate the input and close the dialog box if the input is valid, as shown in the following code.
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
In Solution Explorer, right-click Form1 and select View Designer.
From the Toolbox, drag a Button control onto the form.
Add a Click event handler for the showFormButton control.
In the event handler code, call the dialog box and display the results, as shown in the following code.
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
private void showFormButton_Click(object sender, EventArgs e) { InformationForm iForm = new InformationForm(); DialogResult dr = iForm.ShowDialog(); if (dr == DialogResult.OK) { string txt = "First Name: " + iForm.UserInformation.FirstName + "\r\n"; txt += "Last Name: " + iForm.UserInformation.LastName + "\r\n"; txt += "Email Address: " + iForm.UserInformation.EmailAddress; MessageBox.Show(txt); } iForm.Dispose(); }
Build and run the sample.
When Form1 appears, click the Show Form button.
When InformationForm appears, specify the information and then click OK.
When you click OK, the information that you specified is retrieved from the form, the information is displayed in a message box, and then the form is closed.
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