Tutorial: Recuperar la información de un cuadro de diálogo colectivamente mediante objetos

La mayoría de los cuadros de diálogo de los formularios Windows Forms tienen propiedades que exponen información al formulario primario. En lugar de crear varias propiedades, puede exponer un grupo de datos relacionados a través de una propiedad de cuadro de diálogo mediante la creación de un objeto de clase que almacena toda la información necesaria para el formulario primario.

El tutorial siguiente crea un cuadro de diálogo que expone una propiedad UserInformation que contiene los datos de nombre y dirección de correo electrónico, disponible en el formulario primario incluso después de que se haya cerrado el cuadro de diálogo.

Para crear un cuadro de diálogo que exponga sus datos mediante un objeto

  1. En Visual Studio, cree un nuevo proyecto de formularios Windows Forms denominado DialogBoxObjects. Para obtener más información, vea Cómo: Crear un nuevo proyecto de aplicación de Windows Forms.

  2. Agregue un nuevo Form al proyecto y denomínelo InformationForm. Para obtener más información, vea Cómo: Agregar formularios Windows Forms a un proyecto.

  3. Desde el Cuadro de herramientas, arrastre un control TableLayoutPanel hasta el formulario InformationForm.

  4. Use la etiqueta inteligente que aparece como una flecha al lado del control TableLayoutPanel para agregar una tercera fila a la tabla.

  5. Use el mouse para cambiar el tamaño de las filas de modo que las tres filas sean iguales.

  6. Desde el Cuadro de herramientas, arrastre un control Label a cada celda de tabla de la primera columna.

  7. Establezca la propiedad Name de los controles Label como etiquetaNombre, etiquetaApellidos y etiquetaCorreoElectrónico.

  8. Establezca la propiedad Text de los controles como Nombre, Apellidos y Correo electrónico.

  9. Desde el Cuadro de herramientas, arrastre un TextBox a cada celda de la segunda columna.

  10. Establezca la propiedad Name de los controles TextBox como textoNombre, textoApellido y textoCorreoElectrónico.

  11. Desde el Cuadro de herramientas, arrastre un control Button hasta el formulario.

  12. Establezca la propiedad Name de Button como botónCerrarFormulario.

  13. Establezca la propiedad Text de Button como Aceptar.

  14. Agregue al proyecto un nuevo archivo de clase denominado InformaciónUsuario.

  15. Para un proyecto de C#, agregue el calificador public a la definición de clase para hacer visible esta clase fuera de su espacio de nombres.

  16. En la clase UserInformation, agregue las definiciones de propiedad para las propiedades FirstName, LastName y EmailAddress. Cuando finalice el procedimiento, el código puede tener esta apariencia:

    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. En el Explorador de soluciones, haga clic con el botón secundario del mouse en FormularioInformación y seleccione Ver código.

  18. En la página de código subyacente de FormularioInformación, escriba el código siguiente en la clase InformationForm para agregar una propiedad 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. En la clase InformationForm, agregue un controlador de eventos Validated para cada uno de los controles TextBox.

  20. En el código del controlador de eventos, actualice la propiedad correspondiente de la clase UserInformation siempre que cambie el valor de TextBox, como se muestra en el código siguiente. Para obtener más información, vea Cómo: Crear controladores de eventos con el diseñador.

    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. En la clase InformationForm, agregue un controlador de eventos Click para el control botónCerrarFormulario.

  22. En el código del controlador de eventos, valide la entrada y cierre el cuadro de diálogo si la entrada es válida, como se muestra en el código siguiente.

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

Para mostrar el cuadro de diálogo que ha creado y recuperar los datos mediante un objeto

  1. En el Explorador de soluciones, haga clic con el botón secundario del mouse en Formulario1 y seleccione Ver diseñador.

  2. Desde el Cuadro de herramientas, arrastre un control Button hasta el formulario.

  3. Establezca la propiedad Name de Button como botónMostrarFormulario.

  4. Establezca la propiedad Text de Button como MostrarFormulario.

  5. Agregue un controlador de eventos Click para el control botónMostrarFormulario.

  6. En el código del controlador de eventos, llame al cuadro de diálogo y muestre los resultados, como se muestra en el código siguiente.

    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. Genere y ejecute el ejemplo.

  8. Cuando aparece Formulario1, haga clic en el botón Mostrar formulario.

  9. Cuando aparece FormularioInformación, especifique la información y, a continuación, haga clic en Aceptar.

    Al hacer clic en Aceptar, se recupera la información especificada del formulario, se muestra en un cuadro de mensaje y, a continuación, se cierra el formulario.

Vea también

Tareas

Cómo: Crear cuadros de diálogo en tiempo de diseño

Cómo: Cerrar cuadros de diálogo y conservar los datos introducidos por el usuario

Cómo: Recuperar la información de un cuadro de diálogo selectivamente mediante múltiples propiedades

Conceptos

Introducción de datos por el usuario en los cuadros de diálogo

Otros recursos

Cuadros de diálogo en formularios Windows Forms