演练:使用对象整体检索对话框信息
大部分 Windows 窗体对话框具有向父窗体公开信息的属性。 无需创建多个属性,可以通过创建一个存储父窗体所需的所有信息的类对象,来通过单个对话框属性公开一组相关数据。
下面的演练创建一个公开包含有名称和电子邮件地址数据的 UserInformation 属性的对话框,即使关闭,该对话框仍对父窗体可用。
创建通过对象公开其数据的对话框
在 Visual Studio 中,创建一个名为 DialogBoxObjects 的新 Windows 窗体项目。 有关更多信息,请参见如何:创建新的 Windows 窗体应用程序项目。
将一个新 Form 添加到项目,并命名为 InformationForm。 有关更多信息,请参见如何:向项目添加 Windows 窗体。
从**“工具箱”**中,将一个 TableLayoutPanel 拖动到 InformationForm 窗体中。
使用在 TableLayoutPanel 控件旁显示为箭头的智能标记为表添加第三行。
使用鼠标调整行的大小以使所有三行相等。
从**“工具箱”**中,将一个 Label 拖动到第一列中的每个表单元格中。
将 Label 控件的 Name 属性设置为 firstNameLabel、lastNameLabel 和 emailLabel。
将控件的 Text 属性设置为 First Name、Last Name 和 Email。
从**“工具箱”**中,将一个 TextBox 拖动到第二列中的每个表单元格中。
将 TextBox 控件的 Name 属性设置为 firstNameText、lastNameText 和 emailText。
从**“工具箱”**中,将一个 Button 控件拖动到窗体上。
将名为 UserInformation 的新的类文件添加到项目。
对于 C# 项目,将 public 限定符添加到类定义使此类在其命名空间外可见。
在 UserInformation 类中,为 FirstName、LastName 和 EmailAddress 属性添加属性定义。 完成后,代码应如下所示:
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; } } }; }
在解决方案资源管理器中,右击 InformationForm,然后选择**“查看代码”**。
在 InformationForm 的代码隐藏页面中,在 InformationForm 类中输入以下代码以添加 UserInformation 属性。
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; } }
在事件处理程序代码中,随 TextBox 值的更改更新 UserInformation 类的相应属性,如以下代码所示。 有关更多信息,请参见如何:使用设计器创建事件处理程序。
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); }
在 InformationForm 类中,为 closeFormButton 控件添加一个 Click 事件处理程序。
在事件处理程序代码中,验证输入内容并在输入有效的情况下关闭对话框,如以下代码所示。
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(); }
显示创建的对话框并使用对象检索数据
在解决方案资源管理器中,右击 Form1 并选择**“视图设计器”**。
从**“工具箱”**中,将一个 Button 控件拖动到窗体上。
为 showFormButton 控件添加一个 Click 事件处理程序。
在事件处理程序代码中,调用对话框并显示结果,如以下代码所示。
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(); }
生成并运行示例。
当 Form1 出现时,单击**“显示窗体”**按钮。
当 InformationForm 出现时,指定信息,然后单击**“确定”**。
当单击**“确定”**时,将从窗体中检索您所指定的信息,并在消息框中显示信息,然后关闭窗体。