• Lunes 29 de Abril de 2024, 21:33

Autor Tema:  GENERAR INSTANCIA A PARTIR DE TEXTO DE UN COMBOBOX  (Leído 1463 veces)

megapunto

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
GENERAR INSTANCIA A PARTIR DE TEXTO DE UN COMBOBOX
« en: Domingo 13 de Marzo de 2011, 09:14 »
0
Saludos a todos!!!!

Tengo un botón (button5) que está en el formulario principal de mi aplicación, al presionarlo recorre todos los controles del formulario y me dice cuantos controles hay de los tipos TextBox, PictureBox y Button.  Lo hice así a nivel de ejemplo, pero realmente me interesa saber que controles hay para usar eso para algo más profundo.


       private void button5_Click(object sender, EventArgs e)
        {          
 
            int vBotones = 0, vTextBox = 0, vPictureBox = 0;
            foreach (Control v_Control in this.Controls)
            {
                if (v_Control is Button)
                {
                    v_Control.Text = vBotones.ToString();
                    vBotones += 1;
                }
                else if (v_Control is TextBox)
                    vTextBox += 1;
                else if (v_Control is PictureBox)
                    vPictureBox += 1;
            }

        }

Lo anterior me funciona sin problemas, sin embargo, lo que deseo es tener en el formulario un ComboBox con los nombres de todos los formularios de mi aplicación.  Por ejemplo frmVentas, frmClientes, frmPedidos, etc.  y luego en la linea del código anterior:

            foreach (Control v_Control in this.Controls)

yo poder cambiar this por el nombre del formulario que yo seleccione en el ComboBox y que me de la información de los controles del formulario que seleccione en el ComboBox.

Si yo creo una instancia de cada formulario, por ejemplo:

frmClientes instClientes = new frmClientes();

y luego en la linea pongo lo siguiente:

            foreach (Control v_Control in instClienes.Controls)

me trabaja bien y me da los controles del formulario frmClientes, lo que yo quería era ver si existía una forma de solo tener la linea:

            foreach (Control v_Control in XXXX.Controls)

y de alguna forma poner en XXXX la instancia del formulario que seleccione en el ComboBox.  Es decir, convertir el texto del ComboBox en una instancia válida para pasarla a una variable XXXX.

Espero no haber sido muy complicada mi explicación.  He probado con muchos códigos, pero no consigo lo que deseo, aunque hace años cuando programaba en visual basic 6 si lo logré.

Espero que alguien pueda ayudarme.

gabio2

  • Miembro MUY activo
  • ***
  • Mensajes: 402
  • Nacionalidad: mx
    • Ver Perfil
Re: GENERAR INSTANCIA A PARTIR DE TEXTO DE UN COMBOBOX
« Respuesta #1 en: Martes 15 de Marzo de 2011, 17:51 »
0
Espero te sirva... encontre la primera parte a tu problema..

Código: C#
  1.  
  2.    Module[] Modulos =  Assembly.GetExecutingAssembly().GetModules();
  3.            foreach (Module m in Modulos)
  4.            {
  5.                Type[] Tipos = m.GetTypes();
  6.                foreach (Type _tipo in Tipos)
  7.                {
  8.                    if (_tipo.BaseType.Name == "Form")
  9.                    {
  10.                        this.comboBox1.Items.Add(_tipo);
  11.                        this.comboBox1.DisplayMember = _tipo.FullName;
  12.                    }
  13.                }
  14.            }
  15.            if (this.comboBox1.Items.Count != 0)
  16.            {
  17.                this.comboBox1.SelectedIndex = 0;
  18.  
  19.            }
  20.  
  21.  

Tienes que importar el namespace System.Reflection

using System.Reflection;



Saludos!..
@gabio87

megapunto

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: GENERAR INSTANCIA A PARTIR DE TEXTO DE UN COMBOBOX
« Respuesta #2 en: Miércoles 16 de Marzo de 2011, 07:23 »
0
Gabio2, realmente no estaba preguntando la forma de introducir todos los nombres de los formularios en un combo, pues lo iba a hacer en forma manual, pero gracias a tu intervención, ahora será automático, lo cual es de mucha utilidad y me ahorra estar modificando manualmente el combo cuando tenga un formulario nuevo.  Así que muchas gracias por eso

En cuanto a la segunda parte del problema, ya lo encontré y les paso a todos la solución:

Utilizando:
using System.Reflection;

En primer lugar creamos una función que luciría como  lo siguiente:

        private Form GetForm(string formName)
        {
           
            System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
            foreach (Type type in assembly.GetTypes())
            {
                if (type.Name.Equals(formName))
                    return assembly.CreateInstance(type.FullName) as Form;
            }
            return null;
        }

Y luego la utilizamos:

        private void button5_Click(object sender, EventArgs e)
        {
            string vNombreFormularioEnTexto;
            vNombreFormularioEnTexto = "frmPTesoreria";

            Form objFormulario = GetForm(vNombreFormularioEnTexto);
 
            int vBotones = 0, vTextBox = 0, vPictureBox = 0;
            foreach (Control v_Control in objFormulario.Controls)
            {
                if (v_Control is Button)
                {
                    v_Control.Text = vBotones.ToString();
                    vBotones += 1;
                }
                else if (v_Control is TextBox)
                    vTextBox += 1;
                else if (v_Control is PictureBox)
                    vPictureBox += 1;
            }            
        }

La idea, y es lo que haré ahora, será asignar a la variable string: vNombreFormularioEnTexto, el valor del formulario que yo seleccione en el ComboBox.

De nuevo muchas gracias Gabio2 por tu gran ayuda.