チュートリアル : オブジェクトによるダイアログ ボックス情報の一括取得

ほとんどの Windows フォーム ダイアログ ボックスには、情報を親フォームに公開するプロパティがあります。 複数のプロパティを作成する代わりに、親フォームに必要なすべての情報を格納するクラス オブジェクトを作成すると、単一のダイアログ ボックスにより関連するデータのグループを公開できます。

次のチュートリアルでは、名前と電子メール アドレスのデータを格納する UserInformation プロパティを公開するダイアログ ボックスを作成します。このプロパティは、ダイアログ ボックスを閉じた後でも親フォームから使用できます。

オブジェクトをとおしてデータを公開するダイアログ ボックスを作成するには

  1. Visual Studio で、DialogBoxObjects という名前の新しい Windows フォーム プロジェクトを作成します。 詳細については、「方法: 新しい Windows フォーム アプリケーション プロジェクトを作成する」を参照してください。

  2. 新しい Form をプロジェクトに追加し、「InformationForm」という名前を付けます。 詳細については、「方法 : プロジェクトに Windows フォームを追加する」を参照してください。

  3. ツールボックスから、InformationForm フォームに TableLayoutPanel をドラッグします。

  4. TableLayoutPanel コントロールの横に矢印として表示されているスマート タグを使用して、3 番目の行をテーブルに追加します。

  5. マウスを使用して、3 つの行がすべて等しくなるように行のサイズを変更します。

  6. ツールボックスから、テーブルの第 1 列の各セルに Label をドラッグします。

  7. Label コントロールの Name プロパティをそれぞれ firstNameLabel、lastNameLabel、および emailLabel に設定します。

  8. 各コントロールの Text プロパティをそれぞれ First Name、Last Name、および Email に設定します。

  9. ツールボックスから、第 2 列の各セルに TextBox をドラッグします。

  10. TextBox コントロールの Name プロパティをそれぞれ firstNameText、lastNameText、および emailText に設定します。

  11. ツールボックスから、フォームに Button コントロールをドラッグします。

  12. ButtonName プロパティを closeFormButton に設定します。

  13. ButtonText プロパティを OK に設定します。

  14. UserInformation という名前の新しいクラス ファイルをプロジェクトに追加します。

  15. C# プロジェクトの場合は、クラス定義に public 修飾子を追加して、このクラスをその名前空間の外から参照できるようにします。

  16. 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;
                }
            }
        };
    }
    
  17. ソリューション エクスプローラーで、[InformationForm] を右クリックし、[コードの表示] をクリックします。

  18. 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;
            }
        }
    
  19. InformationForm クラスに、それぞれの TextBox コントロール用の Validated イベント ハンドラーを追加します。

  20. 次のコードに示すように、イベント ハンドラー コードで、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);
            }
    
  21. InformationForm クラスに、closeFormButton コントロール用の Click イベント ハンドラーを追加します。

  22. 次のコードに示すように、イベント ハンドラー コードに、入力を検証し、入力が有効である場合は、ダイアログ ボックスを閉じる処理を記述します。

    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();
        }
    

作成したダイアログ ボックスを表示し、オブジェクトを使用してデータを取得するには

  1. ソリューション エクスプローラーで、[Form1] を右クリックし、[デザイナーの表示] をクリックします。

  2. ツールボックスから、フォームに Button コントロールをドラッグします。

  3. ButtonName プロパティを showFormButton に設定します。

  4. ButtonText プロパティを Show Form に設定します。

  5. showFormButton コントロールの Click イベント ハンドラーを追加します。

  6. 次のコードに示すように、イベント ハンドラー コードに、ダイアログ ボックスを呼び出し、結果を表示する処理を記述します。

    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();
    }
    
  7. サンプルをビルドして実行します。

  8. Form1 が表示されたら、[Show Form] ボタンをクリックします。

  9. InformationForm が表示されたら、情報を指定して [OK] をクリックします。

    [OK] をクリックすると、指定した情報がフォームから取得されてメッセージ ボックスに表示された後、フォームが閉じます。

参照

処理手順

方法 : デザイン時にダイアログ ボックスを作成する

方法 : ダイアログ ボックスを閉じて、ユーザー入力を保持する

方法 : 複数のプロパティを使用してダイアログ ボックス情報を個別に取得する

概念

ダイアログ ボックスへのユーザー入力

その他の技術情報

Windows フォームのダイアログ ボックス