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

Actualización: noviembre 2007

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 proyecto de aplicación para Windows.

  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. En el Cuadro de herramientas, arrastre un control TableLayoutPanel al formulario. Utilice la etiqueta inteligente que aparece como una flecha junto al control para agregar una tercera fila a la tabla, y utilice el mouse para cambiar el tamaño de las filas de tal forma que las tres sean iguales.

  4. Agregue Label a cada celda de tabla de la primera columna y TextBox a cada celda de la segunda columna. Los controles de etiqueta se deben denominar, de arriba abajo, firstNameLabel, lastNameLabel y emailLabel; los controles TextBox se deberían denominar firstNameText, lastNameText y emailText. Cuando finalice, agregue un control Button. Denomínelo okButton y cambie la propiedad Text a Aceptar.

  5. Agregue al proyecto un nuevo archivo de clase denominado UserInformation.

  6. Agregue el calificador public a la definición de clase para hacer visible esta clase fuera de su espacio de nombres, y agregue definiciones de la propiedad a 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;
            }
        }
    };
}
  1. Vuelva al código para InformationForm y agregue una propiedad 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. Controle el evento Validated en cada uno de los controles TextBox para que pueda actualizar la propiedad correspondiente en UserInformation cuando cambie uno de los valores.
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. Agregue controladores al evento Validated para cada uno de los controles TextBox en el formulario, para que el nuevo valor de esos controles se asigne a UserInformation cuando el usuario los cambia.
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. Seleccione Form1 en Visual Studio. Agregue Button al formulario y cambie su propiedad Name a showFormButton.

  2. Haga doble clic en el botón para agregar un controlador de eventos que llame al cuadro de diálogo y muestre los resultados.

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

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