martes 27 de abril de 2010

Conseguir que el formulario hijo se comunique con el padre, Winforms con C sharp

El otro día me encontré con un problema que parecía no tener fácil solución en la red, cosa que solo me hizo confundirme más. Para todo aquel que busque una solución a un problema parecido al mio, aquí dejo mi solución:

Explicando el problema. Genero un formulario para realizar un pedido, en este hay un botón, agregar producto, para agregar un producto de línea de pedido. Al darle a ese botón se nos abre un formulario modal respecto al formulario del pedido, con un DataGridView que nos muestra unos productos que podemos seleccionar y la cantidad que se desea y un botón de agregar producto para añadirlo a las líneas de pedido.
¿Cómo le decimos al padre que reciba la información del hijo y la añada al DataGridView? Parece complicado pero es más fácil de lo que parece a priori (que diga yo esto que me tiré 3 horas haciendolo...XD)

Bien, primeros pasos: PADRE.

Hacer pública tanto la clase como al constructor para que sea conocido por todos.

HIJO.

Al crear el hijo debemos PASARLE EL PADRE POR PARÁMETRO EN EL CONSTRUCTOR. D esta manera cualquier cambio que deba afectar también al padre se puede hacer desde el hijo (hay que declarar un objeto de tipo igual al padre y al pasarselo por parámetro igualarlo al recibido para poder emplear sus objetos, métodos, etc...).

Ahora veamos un ejemplo simple de esto:

PADRE:
.
.
.
public partial class Pedido : Form // es pública!
{
public Pedido() // se hace público para poder usarlo
{
...
.
.
.
--------private void button2_Click(object sender, EventArgs e)
--------{
------------Productos prod_lista = new Productos(this);
// como ves, le pasamos el padre!
------------prod_lista.ShowDialog();
--------}


.

Hijo

.

public partial class Productos : Form
{
Pedido PedidoObj = new Pedido();
----//declaramos un objeto que es idéntico al padre

public Productos(Pedido pedido)
{
//le pasamos el padre por parámetro
InitializeComponent();
PedidoObj = pedido;
//y lo iguaamos al padre para poder emplearlo.
}


Así yo por ejemplo, en el botón de agregar en el formulario hijo (productos) puedo poner un código tal que así en el botón al hacer click:

prod_inser.Existencias = Cantidad_box.Text;
PedidoObj.Importe_box.Text = Convert.ToString(Convert.ToUInt16(PedidoObj.Importe_box.Text) + (Convert.ToUInt16(prod_inser.Existencias) * Convert.ToUInt16(prod_inser.Precio)));
listado.Add(prod_inser);
PedidoObj.dataGridView1.DataSource = listado;
PedidoObj.dataGridView1.Refresh();
PedidoObj.prod_inser = this.prod_inser;
this.Close();


Esto lo que hace es calcular un importe que luego se le pasa al formulario para el total del coste del pedido, insertar el producto seleccionado en el DataGridView del padre y cerrar el formulario modal.

Espero que os sirva. Cualquier sugerencia o propuesta constructiva es bien recibida. Un saludo a todos.

=3

0 opiniones:

Publicar un comentario en la entrada