domingo, 17 de febrero de 2013

[Winform] Instanciar Form conociendo su nombre

 

Introducción


Conociendo solo el nombre del formulario se abra una instancia del mismo.

Para poder realizar esta acción es necesario conocer el nombre del form, pero también bajo que namespace se ubica.

image

por ejemplo para abrir el form de alta de cliente se identifica

SNAGHTML239b6cc

pero si otro form se encuentra dentro de una carpeta es necesario definir el namespace donde se encuentra

SNAGHTML23d2650

Uso de Reflection


Para poder abrirlo vamos a necesitara Reflection el cual no permitirá descubrir el Type del form basado en la unión del namespace + nombre

es por eso que se define:

using System.Reflection;

 

private void btnAbrirForm_Click(object sender, EventArgs e)
{
    Assembly asm = Assembly.GetEntryAssembly();
    Type formtype = asm.GetType(string.Format("{0}.{1}", txtNamespace.Text, txtNombreForm.Text));

    Form f = (Form)Activator.CreateInstance(formtype);
    f.Show();
}

Se toma el assembly donde se encuentran los formularios y se obtiene el tipo, con el cual se creara la instancia dinámicamente

Código


[C#]
 

domingo, 10 de febrero de 2013

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

 

Introducción


Determinar si un form ha sido abierto, evitando que una nueva instancia sea creada.

 

Validar instancia entorno SDI


Para validar la existencia de la instancia de un formulario se hará uso del Application.OpenForms, con este y la ayuda de linq podremos buscar la existencia del form abierto.

image

La selección de botón abrirá una instancia, pero las siguientes pulsaciones solo harán que el mismo form pase al frente.

 

private void btnAbrirFormclientes_Click(object sender, EventArgs e)
{
    //se localiza el formulario buscandolo entre los forms abiertos 
    Form frm = Application.OpenForms.Cast<Form>().FirstOrDefault(x => x is frmEdicionCliente);

    if (frm != null)
    {
        //si la instancia existe la pongo en primer plano
        frm.BringToFront();
        return;
    }
    
    //sino existe la instancia se crea una nueva
    frm = new frmEdicionCliente();
    frm.Show();
}

El truco esta en poder determinar la lista de forma abiertos

image

 

Validar instancia entorno MDI


En un entorno MDI la validación es similar solo cambia la propiedad usada para determinar la lista de forms abiertos

image

 

private void abrirFormClienteToolStripMenuItem_Click(object sender, EventArgs e)
{
    //se localiza el formulario buscandolo entre los forms abiertos 
    Form frm = this.MdiChildren.FirstOrDefault(x => x is frmEdicionCliente);

    if (frm != null)
    {
        //si la instancia existe la pongo en primer plano
        frm.BringToFront();
        return;
    }
    
    //se abre el form de clientes
    frm = new frmEdicionCliente();
    frm.MdiParent = this;
    frm.Show();

}

 

Código


domingo, 3 de febrero de 2013

[WinForms] Listar formulario del proyecto

 

Introducción


Listar los forms del proyecto puede parecer una tarea a simple vista fácil, pero tiene sus particularidades.

En el ejemplo se listara los nombre de los formularios, pudiendo abrirlo mediante la selección en una lista.

SNAGHTML2eee2d7c

 

Listar Formularios


Para listar los formularios podremos ayudarnos de linq, este nos permitirá filtrar por el tipo de clase del cual heredan los forms.

Para obtener las propiedades (como ser el Text) del formulario se requiere una instancia del mismo. Recordemos que en .net todos son objetos, por lo que un form requiere de una instancia para poder acceder a sus propiedades.

 

private void frmPrincipal_Load(object sender, EventArgs e)
{
    
    Assembly asm = Assembly.GetExecutingAssembly();
    
    List<Form> formList = asm.GetTypes()
                                .Where(x => x.IsSubclassOf(typeof(Form)))
                                .Select(x => (Form)Activator.CreateInstance(x))
                                .ToList();


    lstForms.DisplayMember = "Text";
    lstForms.DataSource = formList;
    
}

También se puede realizar la misma tarea sin hacer uso de linq

 

private void frmPrincipal_Load(object sender, EventArgs e)
{

    Assembly asm = Assembly.GetExecutingAssembly();

    List<Form> formList = new List<Form>();

    foreach (Type item in asm.GetTypes())
    {
        if (item.IsSubclassOf(typeof(Form)))
        {
            formList.Add((Form)Activator.CreateInstance(item));
        }
    }

    lstForms.DisplayMember = "Text";
    lstForms.DataSource = formList;

}

Código