Ayuda con una propiedad tipo lista en un custom control

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

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

[D4N93R]

Claro que esta bien tu respuesta xD Ahora es que la leo! Es que hoy llegué cansado y solo leí el primer post y respondí. Ahora es que leí todo completo :P

Y si, el bot está programado en event driven.

:xD

Además me paso todos los días por el foro  :¬¬

<ИΘZIЭ(ŦB>

Bien. Agradezco de verdad toda la explicación, aunque un poco compleja para mí. Igual hice todo lo que enumeró, excepto por el más importante, el de suscribirse al evento ControlAdded, que es justo lo que me hace falta saber. ¿Será posible que escriban un ejemplo del código que suscribe un evento de mi UserControl al evento ControlAdded de la clase CrystalControlCollection? Por favor...

raul338

Atencion: Puede que lo que diga sea disparate pero acabo de quemarme el cerebro con un algoritmo.

Y si inventas tu propia funcion AgregarBoton y ahi lo ubicas? O haz que primero agregue los botones y en una funcion "UbicarBotones" haces lo que tengas que hacer para mostrarlos :P

Seria mas facil que crear una copia personalizada de List(Of t) o similar :P

[D4N93R]

@<ИΘZIЭ(ŦB>
Te recomiendo que te leas esto:

http://carlossantos.wordpress.com/2008/01/20/events-delegates/
http://foro.elhacker.net/net/tutorial_delegados_en_net_c-t301022.0.html (para C# pero es básicamente lo mismo)

@Raul: >_> eso es un poco caimán.


Código (cpp) [Seleccionar]
#DEFINE CAIMAN "Ordinario" xD

SRVAM

C# Programmer

-Estudiante MCTS .NET Framework 3.5-

seba123neo

haber si me queda claro lo que queres hacer, simplemente es un usercontrol que crea botones ? o sea yo le digo que me cree 10 botones y el usercontrol muestra eso ? y que cada uno tenga su evento no ?
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

<ИΘZIЭ(ŦB>

Veo que aún hay algunas dudas. Intentaré explicar todo de nuevo.

Decidí crear un control (UserControl) que funcione como un contenedor de Botones. Sé bien que eso puedo hacerlo con un Panel normal, agregandole Botones desde la ToolBox, pero no quiero hacerlo así. Quiero hacerlo en mi propio control desde una propiedad tipo lista o colección llamada Items. En modo diseño, dicha propiedad me muestra la palabra "(Collection)" seguida de un pequeño botón con tres puntitos que al oprimirse me muestra mi colección de botones en una ventana, con un botón Add y otro Remove. Con Add voy cargando botones a la colección y asignándole sus respectivas propiedades a cada uno. Una vez terminada la inclusión, oprimo el botón Ok de la ventana, quedando lista la colección de botones. Si vuelvo a oprimir el botón con tres puntitos veo la colección ya creada. Hasta ahí voy perfecto.
Ahora bien, lo que me hace falta es que al oprimir el botón Ok en la ventana de la colección se me carguen los botones al UserControl. Necesito captar el cambio en la colección para llamar al código que me agrega y ordena los botones en el UserControl. ¿Cómo lo hago?

<ИΘZIЭ(ŦB>

Les cuento que he estado dándome duro con mi control a fin de hallar la respuesta a mi incógnita, y se podría decir que he tenido éxito. No obstante, hay detalles que aún me gustaría aclarar.
Respecto a la pregunta anterior, ya noté cuándo detectar el cambio de la propiedad tipo colección, aunque me pareció muy raro. Al principio, cuando la creé, supuse que dicho cambio ocurriría en el bloque Set de la propiedad, pero le puse un Breakpoint y no pasaba nada; es decir que la inclusión de un nuevo botón en la colección no estaba relacionado con Set. Por eso estaba preguntando cómo podía detectarla.
Sin embargo, posteriormente noté (usando otro Breakpoint) que al agregar o remover un ítem de la colección se ejecutaba el bloque Get de la propiedad; no entendí por qué. Pero igual escribí allí el llamado al método que agrega y ordena los botones en mi control.
No obstante, mis problemas no acabaron allí. Por un lado, vi que una vez incluidos los botones en mi control podía manipularlos; o sea, moverlos y de hecho sacarlos del control. Eso no me gustó. Y por otro lado, empecé a tener un error con algo llamado SerializableAtribute. Eso me condujo a esta página (entre otras) que me sirvió de mucho: http://msdn.microsoft.com/es-es/library/ms171731.aspx. Gracias a ese ejemplo descubrí que ese extraño caso de que al cambiar la colección se ejecutara Get en vez de Set ocurre sólo al definir la propiedad como lista o colección; pero al definirla como Array se corrige la eventualidad. Es decir que ahora que tengo la propiedad tipo Array, se ejecuta Set al cambiar la colección y presionar el botón Ok en el editor de colecciones. No obstante, sigo sin entender por qué con List y Collection no. Si alguien lo sabe...
Y lo otro que quiero saber es cómo puedo cargar los botones a mi control sin que puedan manipularse. Quiero que sean como los que uno crea directamente en un UserControl, que no son manipulables desde donde usa el mismo. ¿Alguna idea?

[D4N93R]

Citar
Respecto a la pregunta anterior, ya noté cuándo detectar el cambio de la propiedad tipo colección, aunque me pareció muy raro. Al principio, cuando la creé, supuse que dicho cambio ocurriría en el bloque Set de la propiedad, pero le puse un Breakpoint y no pasaba nada; es decir que la inclusión de un nuevo botón en la colección no estaba relacionado con Set. Por eso estaba preguntando cómo podía detectarla.

Correcto, no va a pasar nada porque estás cambiando valores del List no estas cambiando el List como tal.

En el bloque get se detiene no porque estas cambiando la coleccion sino porque pides la colección para agregar, eliminar, o lo que sea hacia el objecto como tal. Pudo haber sido cualquier otra clase, no necesariamente una lista y obtendrías el mismo comportamiento.

Tu puedes hacerlo como quieras, pero la manera que te habíamos dicho es la más sexy.

Un saludo. :)

<ИΘZIЭ(ŦB>

Claro hermano. De hecho, hice todo lo que sugeriste, pero no me dijiste cómo detectar el cambio de la colección. Nunca supe cómo implementar el evento de la colección en el UserControl. Por eso busqué otras fuentes.