Procedura dettagliata: recupero collettivo di informazioni relative alle finestre di dialogo tramite oggetti

Aggiornamento: novembre 2007

La maggioranza delle finestre di dialogo di Windows Form dispongono di proprietà per l'esposizione di informazioni al form padre. Anziché creare più proprietà, è possibile esporre un gruppo di dati correlati tramite una singola proprietà della finestra di dialogo creando un oggetto classe che archivia tutte le informazioni necessarie al form padre.

Nella seguente procedura dettagliata viene creata una finestra di dialogo che espone una proprietà UserInformation che include dati relativi a nome e indirizzo di posta elettronica, disponibile al form padre anche dopo la chiusura della finestra di dialogo.

Per creare una finestra di dialogo che esponga i propri dati attraverso un oggetto

  1. In Visual Studio creare un nuovo progetto Windows Form denominato DialogBoxObjects. Per ulteriori informazioni, vedere Procedura: creare un progetto applicazione Windows.

  2. Aggiungere un nuovo oggetto Form al progetto e denominarlo InformationForm. Per ulteriori informazioni, vedere Procedura: aggiungere Windows Form a un progetto.

  3. Dalla Casella degli strumenti trascinare nel form un oggetto TableLayoutPanel. Utilizzare lo smart tag visualizzato come freccia accanto al controllo per aggiungere una terza riga alla tabella e utilizzare il mouse per ridimensionare le righe in modo che siano tutte e tre uguali.

  4. Aggiungere un oggetto Label a ogni cella della tabella nella prima colonna e un oggetto TextBox a ogni cella nella seconda colonna. I controlli Label dovrebbero essere denominati, dall'alto verso il basso, firstNameLabel, lastNameLabel e emailLabel. I controlli TextBox dovrebbero essere denominati firstNameText, lastNameText e emailText. Al termine, aggiungere un controllo Button. Denominarlo okButton e modificare la proprietà Text su OK.

  5. Aggiungere al progetto una nuova classe denominata UserInformation.

  6. Aggiungere il qualificatore public alla definizione della classe per renderla visibile all'esterno del proprio spazio dei nomi e aggiungere le definizioni delle proprietà per FirstName, LastName e EmailAddress. Al termine, il codice dovrebbe risultare simile al seguente:

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;
            }
        }
    };
}
  1. Tornare al codice per InformationForm e aggiungere una proprietà 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;
        }
    }
  1. Gestire l'evento Validated su ogni controllo TextBox in modo che sia possibile aggiornare la proprietà corrispondente in UserInformation ogni volta che uno dei valori si modifica.
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);
        }
  1. Aggiungere i gestori per l'evento Validated a ogni controllo TextBox nel form, in modo che il nuovo valore dei controlli stessi sia assegnato a UserInformation ogni volta che l'utente li modifica.
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();
    }

Per visualizzare la finestra di dialogo creata e recuperare i dati utilizzando un oggetto

  1. Selezionare Form1 in Visual Studio. Aggiungere un oggetto Button al form e modificare le relative proprietà Name in showFormButton.

  2. Fare doppio clic sul pulsante per aggiungere un gestore eventi che chiami la finestra di dialogo box e visualizzi i risultati.

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

Vedere anche

Attività

Procedura: creare finestre di dialogo in fase di progettazione

Procedura: chiudere finestre di dialogo e mantenere l'input dell'utente

Procedura: recuperare informazioni sulle finestre di dialogo in modo selettivo utilizzando proprietà multiple

Concetti

Input dell'utente all'interno di finestre di dialogo

Altre risorse

Finestre di dialogo in Windows Form