none
Crear metodo que genere nuevas instancias diferentes RRS feed

  • Pregunta

  • hola  me explico, tengo un formulario con varios botones que abre una interfaz diferente algo así:

    private void button4_Click(object sender, EventArgs e)
    {
       Form1 uno = new Form1();
       
       uno.accion1..
       uno.accion2..
       .
       .
       uno.show();
    }
    
    private void button5_Click(object sender, EventArgs e)
    {
       Form2 dos = new Form2();
       
       dos.accion1..
       dos.accion2..
       .
       .
       dos.show();
    }
    
    .
    .
    .

    Como podria crear una funcion para no repetir el codigo en cada boton, ya que en cada boton se crea una instancia de un form diferente.

    miércoles, 27 de junio de 2018 17:45

Respuestas

  • Buenas, 

    Depende un poco de lo que quieras hacer, una opción fácil es crear una clase FormPadre que herede de Form de la que hereden todos los demás formularios, con eso, podrías añadir los métodos "comunes", y cuando la heredes hacer un override que redefina ese comportamiento. Luego tus métodos serian tan simples como llamar al siguiente código pasandole el formulario que abrir como un numero:

    void MetodoParaTodosLosEventos(int nForm)
    {
      FormPadre formulario;
      switch(nForm)
      {
        case 1:
          formulario = new FormHijo1();
          break;
        case 2:
          formulario = new FormHijo2();
          break;
        case 3:
          formulario = new FormHijo3();
          break;
        default:
          formulario = new FormPadre();
          break;
      }
      
      formulario.accion1();
      formulario.accion2();
      formulario.show();
    }

    Pero claro, no se si esto seria una opción valida

    Nos comentas

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Novatoj jueves, 28 de junio de 2018 13:16
    miércoles, 27 de junio de 2018 18:44
  • hola

    Lo primero que vas a tener que definir es una interfaz que implementen los forms para que todos respeten la definicion de accion1() accion2(), etc

    entonces podrias instanciar el form por su nombre

    [Winform] Instanciar Form conociendo su nombre

    sabiendo esto podrias crear un unico metodo click para todos los botones

    private void button_Click(object sender, EventArgs e) { string formTypeName = sender.Tag; Assembly asm = Assembly.GetEntryAssembly(); Type formtype = asm.GetType(formTypeName); Form f = (Form)Activator.CreateInstance(formtype); IAcciones acciones = f as IAcciones;

    if(acciones != null) { acciones.accion1(); acciones.accion2();

    } f.Show(); }


    la idea es que en el boton definas la propiedad Tag con el string del namespace.nombreForm, asi se puede instanciar dinamicamente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP miércoles, 27 de junio de 2018 18:47
    • Marcado como respuesta Novatoj jueves, 28 de junio de 2018 13:16
    miércoles, 27 de junio de 2018 18:46

Todas las respuestas

  • Buenas, 

    Depende un poco de lo que quieras hacer, una opción fácil es crear una clase FormPadre que herede de Form de la que hereden todos los demás formularios, con eso, podrías añadir los métodos "comunes", y cuando la heredes hacer un override que redefina ese comportamiento. Luego tus métodos serian tan simples como llamar al siguiente código pasandole el formulario que abrir como un numero:

    void MetodoParaTodosLosEventos(int nForm)
    {
      FormPadre formulario;
      switch(nForm)
      {
        case 1:
          formulario = new FormHijo1();
          break;
        case 2:
          formulario = new FormHijo2();
          break;
        case 3:
          formulario = new FormHijo3();
          break;
        default:
          formulario = new FormPadre();
          break;
      }
      
      formulario.accion1();
      formulario.accion2();
      formulario.show();
    }

    Pero claro, no se si esto seria una opción valida

    Nos comentas

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    Para obtener una respuesta lo más rápida y concisa posible, te recomiendo:

    • Marcado como respuesta Novatoj jueves, 28 de junio de 2018 13:16
    miércoles, 27 de junio de 2018 18:44
  • hola

    Lo primero que vas a tener que definir es una interfaz que implementen los forms para que todos respeten la definicion de accion1() accion2(), etc

    entonces podrias instanciar el form por su nombre

    [Winform] Instanciar Form conociendo su nombre

    sabiendo esto podrias crear un unico metodo click para todos los botones

    private void button_Click(object sender, EventArgs e) { string formTypeName = sender.Tag; Assembly asm = Assembly.GetEntryAssembly(); Type formtype = asm.GetType(formTypeName); Form f = (Form)Activator.CreateInstance(formtype); IAcciones acciones = f as IAcciones;

    if(acciones != null) { acciones.accion1(); acciones.accion2();

    } f.Show(); }


    la idea es que en el boton definas la propiedad Tag con el string del namespace.nombreForm, asi se puede instanciar dinamicamente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP miércoles, 27 de junio de 2018 18:47
    • Marcado como respuesta Novatoj jueves, 28 de junio de 2018 13:16
    miércoles, 27 de junio de 2018 18:46
  • Amigo Leandro muchas gracias funcionó para crear las instancias, pero ahora no se como modificarlo para validar que cada instancia sea única,  y que al  momento de cerrar el form padre se cierren todos los hijos creados por este metodo.
    miércoles, 27 de junio de 2018 19:47
  • hola

    >>pero ahora no se como modificarlo para validar que cada instancia sea única,

    creo que el articulo puede ayudar

    [WinForms] Verificar si el form esta abierto (instancia unica)

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 27 de junio de 2018 20:15