チュートリアル : オブジェクトによるダイアログ ボックス情報の一括取得
ほとんどの Windows フォーム ダイアログ ボックスには、情報を親フォームに公開するプロパティがあります。 複数のプロパティを作成する代わりに、親フォームに必要なすべての情報を格納するクラス オブジェクトを作成すると、単一のダイアログ ボックスにより関連するデータのグループを公開できます。
次のチュートリアルでは、名前と電子メール アドレスのデータを格納する UserInformation プロパティを公開するダイアログ ボックスを作成します。このプロパティは、ダイアログ ボックスを閉じた後でも親フォームから使用できます。
オブジェクトをとおしてデータを公開するダイアログ ボックスを作成するには
Visual Studio で、DialogBoxObjects という名前の新しい Windows フォーム プロジェクトを作成します。 詳細については、「方法: 新しい Windows フォーム アプリケーション プロジェクトを作成する」を参照してください。
新しい Form をプロジェクトに追加し、「InformationForm」という名前を付けます。 詳細については、「方法 : プロジェクトに Windows フォームを追加する」を参照してください。
ツールボックスから、InformationForm フォームに TableLayoutPanel をドラッグします。
TableLayoutPanel コントロールの横に矢印として表示されているスマート タグを使用して、3 番目の行をテーブルに追加します。
マウスを使用して、3 つの行がすべて等しくなるように行のサイズを変更します。
ツールボックスから、テーブルの第 1 列の各セルに Label をドラッグします。
各 Label コントロールの Name プロパティをそれぞれ firstNameLabel、lastNameLabel、および emailLabel に設定します。
各コントロールの Text プロパティをそれぞれ First Name、Last Name、および Email に設定します。
ツールボックスから、第 2 列の各セルに 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; } }
InformationForm クラスに、それぞれの TextBox コントロール用の 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); }
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 が表示されたら、[Show Form] ボタンをクリックします。
InformationForm が表示されたら、情報を指定して [OK] をクリックします。
[OK] をクリックすると、指定した情報がフォームから取得されてメッセージ ボックスに表示された後、フォームが閉じます。
参照
処理手順
方法 : ダイアログ ボックスを閉じて、ユーザー入力を保持する
方法 : 複数のプロパティを使用してダイアログ ボックス情報を個別に取得する