Ayuda con una propiedad tipo lista en un custom control

Iniciado por <ИΘZIЭ(ŦB>, 10 Marzo 2011, 18:05 PM

0 Miembros y 3 Visitantes están viendo este tema.

<ИΘZIЭ(ŦB>

Qué tal compañeros de foro! Hace tiempo que no pasaba por aqui. Saludos...

Les cuento que hace unos meses aprendi a crear mis propios controles personalizados (custom control), y si que ha sido provechoso. Es la mejor solucion cuando se quiere modificar o agregar propiedades a un control predefinido, o bien crear uno totalmente a la medida.
Pues bien, esto ultimo es justamente mi caso. Estoy creando un panel de botones, al que pueda ir cargandole items tal como se hace en un ListView, por ejemplo, solo que en este caso los items seran botones, que por cierto también son creados por mi.
En fin, para ello me cree una propiedad tipo lista (List (Of CrystalButton)), que se supone usaré para cargar los botones al panel. Pues bien, es justo ahi donde tengo el problema, pues no sé como asociar la inclusion de items a algun evento. ¿Para qué quiero eso? Pues porque es justo ahi donde debo incluir el codigo que me agregue el nuevo item al control e indique su posicion. De no hacer eso sólo puedo cargar ítems en la propiedad tipo lista, pero los botones no se agregan a mi control.
¿Me echan la mano?

Ah! Olvidé mencionar que uso el Visual Studio 2008, y estoy programando en Visual Basic.

Novlucker

Bueno, lo primero que se me ocurre es que crees tu propio customlist heredando de list<t> y sobrecargues el método add agregando un evento :D

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

SRVAM

No entiendo muy bien como lo tienes hecho, por lo que yo he entendido, has heredado tu control de un Listview verdad??
Si es asi, prueba a suscribirte al evento "ItemInserted".
Si eso no te funciona pon el codigo de tu control y asi podre intentar ayudarte mas ;)

Un saludo
C# Programmer

-Estudiante MCTS .NET Framework 3.5-

Novlucker

Lo que entiendo es que tiene un panel en el que uno de sus atributos es una lista generica de botones, y quiere que al agregar un botón en esa lista, se dispare un evento que lo ubique en el panel :P

Puede que yo haya entendido mal :xD

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

SRVAM

Cita de: Novlucker en 10 Marzo 2011, 19:24 PM
Lo que entiendo es que tiene un panel en el que uno de sus atributos es una lista generica de botones, y quiere que al agregar un botón en esa lista, se dispare un evento que lo ubique en el panel :P

Puede que yo haya entendido mal :xD

Saludos

Tienes razon Novluker, se refiere a un panel xDD yo lei listview y claro, ya me lie pensando en eso jajaja

Otra cosa que se peude intentar es que en vez de agregar los botones como items de un list, que se agregen a la coleccion de controles del panel y se suscriba al evento "ControlAdded" praa saber cuando se ha añadido un boton a la lista de controles del panel.

C# Programmer

-Estudiante MCTS .NET Framework 3.5-

<ИΘZIЭ(ŦB>

Bien. Veo que ya entienden lo que quiero, y me han "sugerido" qué hacer. El asunto es que de verdad no tengo idea de cómo hacer lo que dicen. Por ejemplo, ¿cómo 'suscribo' la adición de botones a ese evento "ControAdded"? De verdad es primera vez que intento hacer un control de ese tipo, así que necesito detalles.
Otra cosa: mi control no es un Panel; es decir, no hereda del control Panel. Simplemente funcionará cómo un panel porque contendrá una serie de botones que el usuario irá cargando.

SRVAM

Para que podamos ayudarte mejor lo suyo seria que pudieses el codigo de tu control.

Sino hereda de un panel del que peudas coger eventos tipo ControlAdded puedes crearte tu propio evento y hacer que este salte cuando agregues un nuevo elemento a la lista.

pero es que sin ver tu codigo no se me ocurre mucho mas que decirte para ayudarte.

un saludo
C# Programmer

-Estudiante MCTS .NET Framework 3.5-

<ИΘZIЭ(ŦB>

Entiendo. El asunto es que no tengo código alguno todavía. Lo único que hice fue agregar un nuevo UserControl al proyecto. Cómo saben, esto me muestra un cuadro vacío en la ventana de diseño. Luego me fui al código y agregué una nueva propiedad tipo lista (como ya mencioné), y fue entonces cuando noté que no sabía que más hacer.
Así pues, hasta ahora sólo tengo esta propiedad llamada Items, a la que puedo agregar elementos sin problema desde el modo diseño. Sólo me hace falta captar la inclusión de los ítems en la propiedad, para agregarlos al UserControl.

[D4N93R]

Hola,

Es un poco largo, pero es la manera más sexy de y elegante de hacerlo:

1) En vez de utilizar List(Of CrystalControl), crea una clase que herede de Collection(Of T).

2) En esa clase que la llamaría CrystalControlCollection, tienes que crear un evento público (algo como ControlAdded) con un EventHandler(Of CrystalControlEventArgs).

3)CrystalControlEventArgs es otra clase que hereda de EventArgs con una propiedad pública de tipo CrystalControl que se llame Item (u otro nombre que quieras)

4) Luego haces override del método InsertItem en la clase CrystalControlCollection y ahi llamas al evento ControlAdded (con RaiseEvent en vb.net) en donde le pasas el control que se está añadiendo.

5) Sustituyes la lista por CrystalControlCollection, y te suscribes al evento ControlAdded :)

Puedes hacer muchas más cosas como cuando sacas un control de la lista llamar a otro evento en donde realmente sacas el control del UI. Esto se llama event driven development , creo.

Un saludo!

Novlucker

Que pesado! es como en el code del bot irc que saltaba por todas las páginas buscando eventos :xD

Es parecido a lo que puse al principio :xD la diferencia esta en que había obviado el tema de que los métodos de list no se pueden sobreescribir (por eso la sobrecarga), y lo del customeventhandler. ¿Podemos dar por buena mi respuesta? Di que si, di que si :D

Y pasate más por el foro, que sino sigo sugiriendo chapuzas :xD

Saludos

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein