En esta entrega de HazloExpress cubriremos la necesidad de pasar datos entre formularios en C# con Windows Form o WinForm.
Por lo general pasamos datos desde un formulario a otro formulario al momento de llamarlo y lo hacemos haciendo uso del constructor de la clase de ese formulario o a través de algún método público que contenga.
¿Pero que pasa si queremos pasar datos desde un formulario ya abierto hacia el formulario que lo invocó?
Si estas leyendo este post, entonces es porque te habrás dado cuenta de que pareciera ser imposible. Y te puedo decir que, aunque parezca difícil o imposible, ¡no lo es!
Si Bien podrías usar variables estáticas y pasar la data, pero que pasa si tienes varias ventanas que necesitan esta operación, además de que es un derroche de recurso usar variables estáticas para estos fines.
Bien, ¿entonces cual es la forma correcta?
¡Interfaces!
Sí, con una interfaz podemos solucionar este problema, usando un principio de desarrollo orientado a objeto llamado inversión de dependencia.
Para esto crearemos un proyecto en visual studio y seleccionaremos como lenguaje de programacion a C# le llamaremos ComunicarFormularios.
En nuestro proyecto usaremos 2 formularios
Uno será llamado padre (Este será el que invoca, el que recibirá los datos)
El otro será llamado hijo (quien envía los datos)
También necesitaremos una Interface.
Esta será llamada IContract y solo contendrá un método llamado Ejecutar, (ojo, la interfaz se crean sin modificador de acceso, para este ejemplo se le aplicara el modificador de acceso public).
namespace ComunicarFormularios
{
public interface IContract
{
void Ejecutar(string texto);
}
}
Ahora bien, la ventana o formulario llamado Padre tendrá los siguientes controles
Daremos doble clic en el botón y agregaremos el siguiente código
Hijo hijo = new Hijo(); hijo.contrato = this; hijo.Show();
También heredaremos de la interfaz Icontract e implementaremos su método el cual sobrescribiremos con el código siguiente.
public void Ejecutar(string texto)
{
LblMensaje.Text = texto; //control label
}
La clase padre quedaría de la siguiente forma
namespace ComunicarFormularios
{
public partial class Padre : Form , IContract
{
public Padre()
{
InitializeComponent();
}
public void Ejecutar(string texto)
{
LblMensaje.Text = texto;
}
private void BtnLlamarHijo_Click(object sender, EventArgs e)
{
Hijo hijo = new Hijo();
hijo.contrato = this;
hijo.Show();
}
}
}
También puede que te interese Como filtrar datos en Datagridview C#
La ventana Hijo tendrá los siguientes controles
En este formulario iremos a la clase y agregaremos una propiedad de tipo Icontract la cual llamaremos contrato.
public IContract contrato { get; set; }
En el botón enviar mensaje daremos doble clic y agregaremos el siguiente código
private void BtnEnviar_Click(object sender, EventArgs e)
{
contrato.Ejecutar(TxtMensaje.Text);
}
La clase quedaría de la siguiente forma
namespace ComunicarFormularios
{
public partial class Hijo : Form
{
public IContract contrato { get; set; }
public Hijo()
{
InitializeComponent();
}
private void BtnEnviar_Click(object sender, EventArgs e)
{
contrato.Ejecutar(TxtMensaje.Text);
}
}
}
Ahora ejecutaremos a la aplicación y obtendremos el siguiente resultado
Eso es todo!
Explicación
El formulario hijo no tiene el mecanismo para hacer referencia hacia el objeto que lo invocó, sin embargo cuando instanciamos el objeto hijo le asignamos a la propiedad contracto el valor this, este le pasa la referencia del objeto que lo está invocando o llamando.
//clase padre
Hijo hijo = new Hijo();
hijo.contrato = this; // paso de referencia
hijo.Show();
//Clase Hijo
public IContract contrato { get; set; }
La interfaz por su parte crea una especie de contrato entre ambos objetos, lo cual le permite al objeto hijo invocar los métodos que contiene la interfaz, pero desde la clase padre, ya que el objeto de tipo interfaz fue inicializado con la referencia de la clase padre.
Despues de todo no era tan dificil pasar datos entre formularios C# en WinForm , lo bueno de esto es que puedes utilizar este mecanismo para pasar datos entre objetos, no solo formularios, y mejor aun puedes utilizarlo en cualquier lenguaje de programacion orientado a objetos.
Espero que te sea de ayuda, dale me gusta y no te olvide de compartir y valorar este post.
