• Domingo 22 de Diciembre de 2024, 09:29

Autor Tema:  Llamar Metodos  (Leído 1986 veces)

BGSNAKE007

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Llamar Metodos
« en: Sábado 22 de Marzo de 2008, 20:27 »
0
Hola, queria preguntar si alguien sabe como puede llamar un metodo que tengo en un form desde otro form. O Cómo puede refrecar los valores de un datagridview pero al presionar un boton que tengo en otro fom, Muchas Gracias

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Llamar Metodos
« Respuesta #1 en: Sábado 22 de Marzo de 2008, 22:09 »
0
Mmmm! une vez hice eso por lo que me acuerdo seria..

1.- Para hacerlo mas facil que ambos form esten en el mismo espacio de nombres.
2.- El metodo a llamar debe ser publico.
3.- Crea un obj que referencie al otro form ej: Form myForm2 = new Form();
4.- llama al metodo publico dentro del obj form  ej: myForm.myMetod();

5.-Hay otras maneras como que Form2 sea clase derivada de Form1 y herede los metodos publicos y/o protegidos de su clase base

BGSNAKE007

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Llamar Metodos
« Respuesta #2 en: Sábado 22 de Marzo de 2008, 22:35 »
0
Gracias por tu ayuda, pero ya habia hecho la primer forma que me dices y no funciona, parace que no lo llama.

lalo_soft

  • Miembro MUY activo
  • ***
  • Mensajes: 469
    • Ver Perfil
Re: Llamar Metodos
« Respuesta #3 en: Domingo 23 de Marzo de 2008, 00:12 »
0
Que raro  :blink:  ,si puedes colocar algo de codigo

E.Baley

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: Llamar Metodos
« Respuesta #4 en: Domingo 23 de Marzo de 2008, 16:20 »
0
Como siempre, tienes varias soluciones. Te apunto un par de las que yo uso, dependiendo del caso.

1- El Form que invoca mantiene una referencia del Form que recibe la llamada.
Como dice lalo_soft, el método debe ser público.
Supongamos que tienes dos forms, uno llamado "MainWindow" y otro llamado "Opciones". El método es de "MainWindow", y en un momento dado queremos que lo invoque el Form "Opciones".
En este caso, en el momento de la creación de "Opciones" le pasamos en el constructor la referencia del "MainWindows".

Por ejemplo, si creamos los dos Forms por separado, desde el método de creación hacemos:

Código: Text
  1. MainWindow MW = new MainWindow();
  2. Opciones OP = new Opciones(MW);
  3.  

Evidentemente, en el constructor de "Opciones" deberemos incluir el parámetro de entrada y guardar la referencia en una variable. Imaginemos que lo guardamos en la variable "_mw"
Así, cada vez que queramos invocar el método, desde "Opciones" simplemente haremos:

_mw.ElMetodo(los parametros);

Por ejemplo (2): creamos la "MainWindow" y desde ahí el resto de Forms. En el inicio de este (evento "MainWindow_Load" o incluso en el constructor) crearemos la referencia de "Opciones" y los otros Forms, y le pasamos directamente la referencia del "MainWindow".

Sería:

Código: Text
  1. private void MainWindow_Load(object sender, EventArgs e) {
  2.     Opciones op = new Opciones(this);
  3. }
  4.  

Desde "Opciones" la estrategia sería la misma: guardar en una variable la referencia de la "MainWindow" e invocarla de la misma forma.

2- El Form que invoca no mantiene la referencia.
Esta estrategia es una de las que más uso. En vez de implementar otras estrategias más complejas y elegantes, yo prefiero esta por su simplicidad y flexibilidad.
Me hago una clase pública y estática, que mantiene referencias (estáticas) a objetos que deben ser accedidos desde varios sitios. De esta forma, cada objeto (ya sea un Form o cualquier otro), puede siempre acceder a la propiedad adecuada de la clase estática, que le devolverá siempre la misma referencia, en este caso, el Form cuyo método queremos invocar.
Con un ejemplo se ve más claro. Esta es la clase estática:

Código: Text
  1. static class Globales {
  2.  
  3.         // -----------------------------------
  4.         private static MainWindow mw = null;          // Ventana principal
  5.         public static MainWindow MW{
  6.             get { return mw; }
  7.             set { mw = value; }
  8.         }
  9.         // -----------------------------------
  10.         private static Opciones op = null;                    // Ventana de opciones
  11.         public static Opciones  OP{
  12.             get { return op; }
  13.             set { op = value; }
  14.         }
  15.         // y otros objetos que me interesa mantener como accesibles en cualquier lugar
  16. }
  17.  

Ahora, desde el método Main() de la aplicación, voy creando las instancias y seteandolas en la clase global:

Código: Text
  1. [STAThread]
  2.         static void Main() {
  3.  
  4.         Application.EnableVisualStyles();
  5.         Application.SetCompatibleTextRenderingDefault(false);
  6.  
  7.         Opciones ooo = new Opciones();
  8.         Globales.OP = ooo;
  9.  
  10.         MainWindow mmm = new MainWindow ();
  11.         Globales.MW = mmm;
  12.  
  13.         // corremos la ventana ppal
  14.         Application.Run(mmm);
  15.  
  16. }
  17.  

Y así, sin guardar la referencia, desde "Opciones" siempre podemos hacer:

Código: Text
  1. Globales.MW.ElMetodo(los parametros);
  2.  

Hay otras soluciones, pero supongo que con una de estas ya te vale.
Saludos.

BGSNAKE007

  • Miembro activo
  • **
  • Mensajes: 40
    • Ver Perfil
Re: Llamar Metodos
« Respuesta #5 en: Domingo 23 de Marzo de 2008, 18:54 »
0
Hola Muchas Gracias por tu ayuda. Ya intente los metodos que me dices, pero el problema es el siguiente. Hice todo igual como me dijiste y si, me llama los metodos del otro Form, pero cuando estoy escribiendo el codigo, pero en tiempo de ejecución el llega al llamado pero no lo hace, pasa directo.
Yo tengo esto, tengo  user Control que se llama ctlrControlExpedientes, en este tengo un datagridview, el otro que tengo es un form llamado frmPacientes, en este tengo los campos que se guardara en la base., y tambien tengo un boton que hace el guardado, lo que yo necesito es que cuando yo le doy al boton guardar me llame a un metodo que esta en el crtlControlExpedientes, este metodo es que me llena el grid que esta en ese form. Ya hice los que me dijiste, pero en tiempo de diseño me aparece muy bien, Instancias.MV.llenargrid();, pero a la hora de ejecución, el pasa por ahi pero no hace nada, es como si no exitiera, no me llama al metodo. Si sabes a que se debe te lo agradeceria demasiado. Muchas Gracias

E.Baley

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: Llamar Metodos
« Respuesta #6 en: Domingo 23 de Marzo de 2008, 19:30 »
0
La verdad es que no entiendo muy bien lo que dices.

Dices: "Yo tengo esto, tengo user Control que se llama ctlrControlExpedientes, en este tengo un datagridview"
Pero eso es un Form o un Control ?? cómo puedes tener un dataGridView en un Control ?
Asumo que es un Form, no un "user Control" como dices

El resto lo entiendo a medias. Creo que tienes un Form llamado "frmPacientes" que rellenas con datos.
Al pulsar un botón, los datos se guardan y quieres visualizarlos en el DataGridView de otro form (el Form "ctlrControlExpedientes", que es un Form, no un control).

Supongo que el método invocado en el Form "ctlrControlExpedientes" es "llenargrid()".

Si has seguido una de las opciones anteriores, sólo te queda comprobar si la llamada llega.
Dentro de "llenargrid()" pon una instrucción que te revele si ha llegado hasta ahí, por ejemplo:
MessageBox.Show("Ha llegado a llenargrid()");

Si aparece el PopUp, la llamada SI llega, y tu problema será otro (pero por lo menos este ya está resuelto  :D  ).

Suerte.