El código completo tanto en C# como en Visual Basic .NET está disponible en:
Códigos de muestra - Ejemplos MSDN. Comunicación entre formularios Windows Forms
Esta es una consulta muy habitual: ¿Cómo pasar datos entre dos formularios?
Evidentemente hay múltiples formas de hacerlo y elegir la mejor depende en gran medida del caso particular. En este artículo mostraré un ejemplo de cómo podemos solucionar uno de los escenarios más repetidos y que puede ajustarse a muchos de los escenarios que se plantean habitualmente: crear un formulario para editar los datos de una fila de un DataGridView.
Para mostrar el ejemplo voy a crear un nuevo proyecto Windows Forms llamado
DialogForm en el que definiré dos formularios:
Un formulario principal llamado
MainForm que tendrá un control DataGridView (
dataGridView1) para mostrar los datos y un botón (
btnAdd) para añadir nuevas filas.
En el DataGridView definiré 4 columnas: dos de tipo DataGridViewTextBoxColumn para el Nombre (
NameColumn) y Apellido (
SurnameColumn), una de tipo DataGridViewCheckboxColumn para indicar si el registro está Activo (
ActiveColumn) y una de tipo DataGridViewButtonColumn (
EditColumn) que contendrá el botón para llamar al formulario de edición.
Por último, ya que la edición de los registros se realizará a través de un formulario, deshabilitaré las propiedades que permiten añadir, eliminar y eliminar filas en el DataGridView.
Un segundo formulario (
DialogForm) para editar los datos de las filas. Este segundo formulario tendrá dos TextBox (
txtName y
txtSurname) con sus respectivas etiquetas para el nombre y apellido, un CheckBox (
chkActive) para indicar si el registro está activo, y dos botones (
btnOk y
btnCancel) para confirmar o cancelar la edición.
Para acabar de preparar el ejemplo voy a crear una clase
Person para encapsular los datos de cada una de las filas. Esta clase tendrá dos propiedades
Name y
Surname de tipo
String y una propiedad
Active de tipo
Boolean.
internal class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public bool Active { get; set; }
}
Friend Class Person
Public Property Name As String
Public Property Surname As String
Public Property Active As Boolean
End Class
El formulario de edición
El código del formulario de edición es extremadamente simple.
En primer lugar voy a crear una propiedad interna CurrentPerson de tipo Person que permitirá establecer y leer los valores del formulario desde el resto de las clases del proyecto. El método get de esta propiedad devuelve un objeto Person con los datos introducidos en el formulario, mientras que el método set recibe un objeto Person y rellena con los datos recibidos los controles del formulario:
internal Person CurentPerson
{
get
{
return new Person()
{
Name= txtName.Text,
Surname = txtSurname.Text,
Active = chkActive.Checked
};
}
set
{
txtName.Text = value == null ? string.Empty : value.Name;
txtSurname.Text = value == null ? string.Empty : value.Surname;
chkActive.Checked = value != null && value.Active;
}
}
Friend Property CurrentPerson As Person
Get
Return New Person() With
{
.Name=txtName.Text,
.Surname=txtSurname.Text,
.Active=chkActive.Checked
}
End Get
Set
txtName.Text = If(Value Is Nothing, String.Empty, Value.Name)
txtSurname.Text = If(Value Is Nothing, String.Empty, Value.Surname)
chkActive.Checked = Value IsNot Nothing AndAlso value.Active
End Set
End Property
Los botones simplemente se encargarán de establecer el valor de la propiedad
DialogResult del formulario. El botón Aceptar establece un valor de
DialogResult.OK mientras que el botón Cancelar establecerá el valor
DialogResult.Cancel.
private void btnOk_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
}
private void btnCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
}
Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
DialogResult = DialogResult.OK
End Sub
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
DialogResult = DialogResult.Cancel
End Sub
El formulario principal
En el formulario principal voy a cargar algunos datos de prueba en el evento Load del formulario:
private void MainForm_Load(object sender, EventArgs e)
{
dataGridView1.Rows.Add("Darth", "Vader", true);
dataGridView1.Rows.Add("Luke", "Skywalker", false);
dataGridView1.Rows.Add("Leia", "Organa", true);
dataGridView1.Rows.Add("Han", "Solo", false);
dataGridView1.Rows.Add("Obi-Wan", "Kenobi", true);
dataGridView1.Rows.Add("Wilhuff", "Tarkin", false);
}
Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dataGridView1.Rows.Add("Darth", "Vader", True)
dataGridView1.Rows.Add("Luke", "Skywalker", False)
dataGridView1.Rows.Add("Leia", "Organa", True)
dataGridView1.Rows.Add("Han", "Solo", False)
dataGridView1.Rows.Add("Obi-Wan", "Kenobi", True)
dataGridView1.Rows.Add("Wilhuff", "Tarkin", False)
End Sub
Para editar una fila al pulsar el botón Editar de la fila introduciremos el código en el evento
ContentClick del grid. Al pulsar el botón crearé una nueva instancia del formulario
DialogForm estableciendo como valor de la propiedad
CurrentPerson un objeto
Person con los datos de la fila.
A continuación mostraré el diálogo utilizando el método
ShowDialog. Si este método devuelve un valor
DialogResult.OK recupero los valores actuales de la propiedad
CurrentPerson que devolverá los valores actuales de los controles del formulario de edición y los establezco como valores de la fila:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var grid = (DataGridView) sender;
if (grid.Columns[e.ColumnIndex].Name != "EditColumn") return;
var rowToEdit = grid.Rows[e.RowIndex];
var dialog = new DialogForm
{
CurentPerson = new Person()
{
Name = (string) rowToEdit.Cells["NameColumn"].Value,
Surname = (string) rowToEdit.Cells["SurnameColumn"].Value,
Active = (bool) rowToEdit.Cells["ActiveColumn"].Value
}
};
if (dialog.ShowDialog() == DialogResult.OK)
{
rowToEdit.Cells["NameColumn"].Value = dialog.CurentPerson.Name;
rowToEdit.Cells["SurnameColumn"].Value = dialog.CurentPerson.Surname;
rowToEdit.Cells["ActiveColumn"].Value = dialog.CurentPerson.Active;
}
}
Private Sub dataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dataGridView1.CellContentClick
Dim grid = CType(sender, DataGridView)
If grid.Columns(e.ColumnIndex).Name <> "EditColumn" Then
Return
End If
Dim rowToEdit = grid.Rows(e.RowIndex)
Dim dialog = New DialogForm() With
{
.CurrentPerson = New Person() With
{
.Name = rowToEdit.Cells("NameColumn").Value,
.Surname = rowToEdit.Cells("SurnameColumn").Value,
.Active = rowToEdit.Cells("ActiveColumn").Value
}
}
If dialog.ShowDialog() = DialogResult.OK Then
rowToEdit.Cells("NameColumn").Value = dialog.CurrentPerson.Name
rowToEdit.Cells("SurnameColumn").Value = dialog.CurrentPerson.Surname
rowToEdit.Cells("ActiveColumn").Value = dialog.CurrentPerson.Active
End If
End Sub
El código del botón Añadir es más sencillo. Simplemente creo una nueva instancia del formulario
DialogForm sin establecer ningún valor en la propiedad
CurrentPerson para mostrar el formulario vacío.
Si el método
ShowDialog devuelve
DialogResult.OK se establecen los valores de la propiedad
CurrentPerson como valores de las celdas de una nueva fila del
DataGridView.
private void btnAdd_Click(object sender, EventArgs e)
{
var dialog = new DialogForm();
if (dialog.ShowDialog() == DialogResult.OK)
{
dataGridView1.Rows.Add(
dialog.CurentPerson.Name,
dialog.CurentPerson.Surname,
dialog.CurentPerson.Active
);
}
}
Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
Dim dialog = New DialogForm()
If dialog.ShowDialog() = DialogResult.OK Then
dataGridView1.Rows.Add(
dialog.CurrentPerson.Name,
dialog.CurrentPerson.Surname,
dialog.CurrentPerson.Active
)
End If
End Sub
Si arrancamos la aplicación podemos comprobar que tanto el botón Editar como el Añadir permiten editar y añadir nuevas filas.
El código completo tanto en C# como en Visual Basic .NET está disponible en:
Códigos de muestra - Ejemplos MSDN. Comunicación entre formularios Windows Forms
De gran ayuda. Muchisimas gracias!
ResponderEliminarMe alegro de que te haya ayudado. Un saludo.
EliminarGracias, me sirvio mucho.
ResponderEliminarGracias: Después de tanto buscar encuentras esto que te explica bien como se debe..
ResponderEliminartengo una duda donde puedo crear el currentPerson
ResponderEliminarTengo una consulta estoy realizando un proyecto para mi universidad en donde quiero pasar los datos de un datagridview de un formulario a los combobox y textbox de otro formulario... al momentos de ejecutar el codigo unicamente me captura los textbox pero los combobox no me captura los combobox. Podrias mostrar un ejemplo de como harias el codigo para que me cacture los combobox.. espero tu pronta respuesta
ResponderEliminarhola como estas, a mi me da error en DialogForm
ResponderEliminarHola tienes que leer detalladamente la explicación.. ese es el nombre del segundo formulario
Eliminar