viernes, 7 de enero de 2011

Ejecutar un método de otro formulario Visual C#

Muchas veces he visto preguntas en diversos foros y sitios web la pregunta de "¿Como puedo ejecutar un método de otro formulario?". Bueno, en la práctica no había tenido que hacerlo nunca, sin embargo y por flojera poco antes de que terminara el año me encontré con ésta necesidad.

En la práctica el dilema era más o menos así:
  • Form1 tenia el método getContactNameByRUT(int rut) el cual retorna obviamente recupera el nombre de la persona.
  • Form2 se crea en función a ciertos elementos ingresados en el Form1 pero éste es totalmente independiente se sus atributos. Donde uno de los eventos del Form2 requiere llamar al método getContactNameByRUT por equis motivo.
Muchos dirán ¿hey!, por que no estructuras las clases y heredas lo que necesitas!? o ¿y por que no usas propiedades para recuperar el valor?. Puesto bueno, a todos ellos les digo pudranse! que muchas veces y sobretodo por temas de tiempo es más rápido parchar y avanzar, aunque conozco el dicho de "Un buen programador es aquel que elimina el código defectuoso, mientras que un mal programado agrega código para parchar".
Puest bueno, la solución en si es bastanet simple y sólo requiere sobrecarga el metodo Load de nuestro formulario 2 pasandole la instancia del Form1 (instancia que contiene a nuestro metodo getContactNameByRUT).

El resultado es más o menos así

FORM1

//preparamos nuestro contenedor de la instancia.
private Form1 instance;
public Form1()
{
        InitializeComponent();
        //cargamos nuestra instancia dentro de nuestra variable
        instance = this;
}
private void form1_load(object sender, EventArgs e)
{
        //hace lo que sea y levantamos nuestro Form2
        Form2 f2 = new Form2(this)
}

public string getContactNameByRUT(int rut)
{
        //bla bla bla!
        return contactName;
}

FORM2
//creamos un manejador
private Form1 form1Handler;

public Form2()
{
        InitializeComponent();
}
//Hacemos una sobrecarga para esperar la instancia del Form1

public Form2(Form1 form1)
{
        InitializeComponent();
        form1Handler = form1;
}

private void form2_load(object sender, EventArgs e)
{
        int rut = 1111111111;
        string contactName = form1Handler.getContactNameByRUT(rut);
}

Y Listo! Ya podemos llamar a métodos de otro formulario!

Ojala les sirva.

6 comentarios:

  1. InitializeComponent() , no tengo ese metodo..como se saca?

    ResponderEliminar
    Respuestas
    1. Es parte de los elementos automáticos que se generaban con las versiones antiguas de VS... de todas formas no es parte importante para manejar el control del formulario.

      Aquí un poco mas de info:

      http://social.msdn.microsoft.com/Forums/es/vbes/thread/ce79ff6a-b792-4c37-b457-f1dba456ac50


      Slds,

      Eliminar
  2. Me salvaste la vida, gracias!

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar