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