miércoles, 13 de febrero de 2013

C# - Helper - Crear y llamar controles dinamicamente

Muchas veces he llamado a controles de mi forma de la manera tradicional, no hay problema cuando solo se contiene un solo control que contiene la información, pero que pasa cuando tengo que generar por ejemplo un datagridview por cada uno de los empleado con su información respectiva, mi código se llenaba de asignaciones a los datasets y datagridviews por cada una de las acciones que tomaba en cada una. Mi código se multiplicaba de if y else if, no se diga cuando tenia que agregar uno mas, tenia que modificar directamente el código.

Cansado de tal situación, aprendí un poco de como controlar las formas y sus controles, esta forma me ayudo demasiado a controlar la visibilidad de un diagrama dinámico hecho de puros Controles Shapes. Eran mas o menos 200 lineas, las cuales me generaban 200 lineas de visible = false ó visible = true.
Este es un ejemplo muy tonto y se que hay otras maneras de realizar lo que hace este ejemplo; pero la finalidad es que aprovechemos el método que se encuentra en la clase Helper y verán que se le saca demasiado con tan solo unas líneas de código.

El ejemplo lo que hace es crear 50 botones dinamicamente alineados en la pantalla. Al dar click sobre cada botón, este se mueve 10pt de su posición original. Además se crea un botón en la parte superior que permite mover todos los botones especificados al mismo tiempo.



Este es el código de la forma:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadControls();
        }

        private void LoadControls()
        {
            // Se crea el boton que movera todos los botones al mismo tiempo
            Button btn = new Button();
            btn.Text = "Mover Todos";
            btn.Click += new System.EventHandler(ButtonMover);
            btn.Size = new Size(100, 50);
            btn.Location = new Point(0,0);
            this.Controls.Add(btn);

            // Se crean 50 botones dinamicamente
            for (int i = 0; i < 50; i++)
            {
                btn = new Button();
                btn.Name = "myButton" + i.ToString();
                btn.Size = new Size(10, 10);
                btn.Location = new Point(10 * i, 100);
                btn.Text = i.ToString();
                btn.Tag = i.ToString();
                btn.Click += new System.EventHandler(ButtonClick);
                this.Controls.Add(btn);
            }
        }

        private void ButtonClick(object sender, System.EventArgs e)
        {
            //Modo Manual
            Button btnManual = (Button)sender;
            btnManual.Location = new Point(btnManual.Location.X, btnManual.Location.Y + 10);
        }

        private void ButtonMover(object sender, System.EventArgs e)
        {
            //Modo Dinamico
            for (int i = 0; i < 50; i++)
            {
                Button btnDinamico = (Button)Helper.ObjetoDinamico(this,"myButton" + i.ToString());
                btnDinamico.Location = new Point(btnDinamico.Location.X, btnDinamico.Location.Y + 10);
            }
        }

    }
}


Este es el código de la clase estática llamada Helper:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public static class Helper
    {
        public static object ObjetoDinamico(Form forma, String nameControl)
        {
            try
            {
                Control[] ctr = forma.Controls.Find(nameControl, true);
                return (object)ctr[0];
            }
            catch
            {
                return null;
            }
        }
    }
}