Crear un array de objetos dinámicamente en C#

6 febrero 2010

El menú de selección de mi programa de control de inventario y costes está programado para crear dinámicamente un vector de categorías y otro de botones. Como el programa crece y aumentan los formularios, necesitaba una manera cómoda y flexible de crear botones que apuntasen a cada formulario específico.

El resultado ha sido una DLL que he bautizado como biblioteca de controles y me ha gustado mucho pues en muy poco código se sintetiza gran parte de lo que representa el paradigma de la programación orientada a objetos. Está formada por varias categorías y dentro de cada categoría una serie de botones. Tanto los botones como las categorías se crean en tiempo de ejecución. Cuando uno de los botones es pulsado, se activa un evento que devuelve no solo que se ha pulsado un botón sino cual de todos ha sido. Es decir, cuando se pulse el botón 5, se activará el evento botón pulsado y me dará como parámetro, que ha sido el número 5.

Pongo el código comentado y añado los enlaces que mejor explican cada concepto para que se entienda.

En esencia, el programa con el programa se crea en tiempo de ejecución un array de objetos, que en este caso son botones.

Para hacer lo anterior, necesitamos :

EVENTOS – Una clase derivada de la base de eventos, que devuelva el valor del índice

DELEGADOS – Un evento delegado que apunte a la clase que hemos creados con el valor del índice

HERENCIA – Un botón que herede las propiedades del botón de Windows Forms y devuelva el número de indice.

Aquí tienes el código comentado

Lo he reducido al mímino para explicar solo las partes más interesantes, el proyecto con este código está aqui. El código de la librería entera está en el archivo comprimido que te puedes descargar aqui.

/*
* Creado por SharpDevelop.
* Usuario: Enrique
* Fecha: 06/02/2010
*/

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace BibliotecaEjemplo
{
// Creamos la clase IntEventArgs, derivada de EventArgs y que recibe una variable tipo int
public class IntEventArgs: EventArgs
{

public IntEventArgs(int valor)
{

this.valor = valor;

}

public int valor;

}

// Creamos un objeto Boton1 que hereda todas las propiedades del objeto Button de Windows Forms y al que modificamos

// el evento On_Click para que responda con el número de índice

public class Boton1 : System.Windows.Forms.Button

{

public int indice;   // Esta variable será la que contenga el índice dentro del vector de objetos

public int categoria;  // En esta variable le indicamos a qué categoría pertenece

public delegate void IntEventHandler(object sender, IntEventArgs e);  // Puntero hacia la clase IntEventHandler.

public event IntEventHandler Click_ConIndice; // Evento

public Boton1()

{ }

//  Cambiamos el método OnClick original del objeto Button por este código, lo que se hace es que al pulsar el botón, se dispara este evento en vez del original

//  y este evento contiene el índice para poder distinguirlo del resto de botones

protected override void OnClick(EventArgs e)
{

IntEventArgs ex = new IntEventArgs(indice);

if(Click_ConIndice!=null)
Click_ConIndice(this,ex);

}

}

// Creamos la clase que contendrá los botones creados dinámicamente
// SharpDevelop crea un Warning al poner esta clase la última, pero lo compila y ejecuta y
// se ve mejor si está al final

public partial class MainForm : Form
{

// Creamos un vector de objetos Boton1, es decir, boton2Array[1], boton2Array[2].. son objetos Boton1,

public Boton1[] boton2Array;

int numeroBotones;

public MainForm()
{

InitializeComponent();

numeroBotones = 10;

boton2Array = new Boton1[numeroBotones];

int i;

// Creamos en tiempo de ejecución los 10 botones
for (i=numeroBotones;i>0;i–)
creaBoton(i-1);
}

void creaBoton (int i)
{

Boton1 boton = new Boton1();  // Se crea un nuevo objeto tipo Boton1
boton2Array[i] = boton;       // Lo ponemos en el array
boton.indice = i;              // Le asignamos a la propiedad indice el número de boton
boton.Text = i.ToString();
boton.Location = new System.Drawing.Point(20, i*20);

// Cuando se dispare el evento Click_ConIndice del botón que acabamos de crear,  se ejecutará
// la función Boton_Click_ConIndice que recibirá el índice del botón

boton.Click_ConIndice += Boton_Click_ConIndice;

// Se añade el botón creado al formulario
this.Controls.Add(this.boton2Array[i]);

}

// Todos los botones ejecutaran esta función al dispararse el evento Click_ConIndice
// Podremos saber cual de los botones ha sido pulsado mediante
// e.valor
void Boton_Click_ConIndice(object sender, IntEventArgs e)
{

MessageBox.Show(“Se ha pulsado el botón número : ” + e.valor.ToString());

}
}
}

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: