Пошаговое руководство. Извлечение всех сведений вместе из диалогового окна с помощью объектов
Большинство диалоговых окон Windows Forms имеют свойства, которые предоставляют сведения родительской форме. Вместо создания нескольких свойств можно предоставить набор связанных данных из диалогового окна, создав объект класса, который хранит все сведения для родительской формы.
В данном пошаговом руководстве создается окно, предоставляющее свойство UserInformation, содержащее имя и адрес электронной почты, которое является доступным родительской форме даже после закрытия окна.
Чтобы создать диалоговое окно, предоставляющее собственные данные через объект
В Visual Studio создайте новый проект Windows Forms под названием DialogBoxObjects. Дополнительные сведения см. в разделе Практическое руководство. Создание проекта приложения Windows Forms.
Добавьте новую форму Form в проект и назовите ее InformationForm. Дополнительные сведения см. в разделе Практическое руководство. Добавление форм Windows Forms в проект.
Из Панели элементов перетащите элемент управления TableLayoutPanel на форму InformationForm.
Чтобы добавить в таблицу третью строку, воспользуйтесь смарт-тегом, который отображается в виде стрелки рядом с элементом управления TableLayoutPanel.
С помощью мыши измените размер строк, чтобы все три строки были равны.
Из Панели элементов перетащите элемент управления Label в каждую ячейку первого столбца.
Задайте для свойства Name элементов управления Label значения firstNameLabel, lastNameLabel и emailLabel.
Задайте для свойства Text элементов управления значения First Name, Last Name и Email.
Из Панели элементов перетащите элемент управления TextBox в каждую ячейку второго столбца.
Задайте для свойства Name элементов управления TextBox значения firstNameText, lastNameText и emailText.
Из Панели элементов перетащите на форму элемент управления Button.
Задайте для свойства Name элемента управления Button значение closeFormButton.
Задайте для свойства Text элемента управления 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; } }
В классе InformationForm добавьте обработчик событий Validated для каждого из элементов управления TextBox.
В коде обработчика событий обновляйте соответствующее свойство класса UserInformation каждый раз, когда значение TextBox изменится, как показано в следующем коде. Дополнительные сведения см. в разделе Руководство: создание обработчика событий с помощью конструктора.
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 добавьте обработчик событий Click для элемента управления closeFormButton.
В коде обработчика событий проверьте входные данные и, если они допустимы, закройте диалоговое окно, как показано в следующем коде.
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.
Задайте для свойства Name элемента управления Button значение showFormButton.
Задайте для свойства Text элемента управления Button значение Показать форму.
Добавьте обработчик событий Click для элемента управления showFormButton.
В коде обработчика событий вызовите диалоговое окно и отобразите результаты, как показано в следующем коде.
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, введите информацию и нажмите кнопку ОК.
При нажатии кнопки ОК введенная информация извлекается из формы и отображается в окне сообщения, затем форма закрывается.
См. также
Задачи
Практическое руководство. Создание диалоговых окон во время разработки.
Практическое руководство. Закрытие диалоговых окон и сохранение введенных пользователем данных
Основные понятия
Ввод пользовательских данных в диалоговых окнах