begin process at 2012 02 14 18:06:13
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Windows

 > 

UserControl

 > 

Création d'un controle type liste


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Création d'un controle type liste

mardi 11 décembre 2007 à 23:54:38 | Création d'un controle type liste

Kevin.Ory

Bonsoir,
J'ai déjà créé de nombreux controles Windows (allant d'un color picker à une liste d'images, passant pas une progressbar) et tout fonctionne parfaitement bien. Toutefois, et c'est le cas à chaque fois, le développement d'un controle de type liste comme la listview ou la treeview me titille le cerveau :)
Ma question est: comment structurer le controle pour que les modifications apporté à sa liste d'éléments se répercute sur l'affichage. J'ai évidement trouvé des solutions, mais je voudrais savoir comment le font les vrais pro, dans le but d'avoir une base solide dans la création de ce genre de controles.

Prenons par exemple un controle qui affiche une liste d'image:

Public Class ImageListBox
    Inherits UserControl
   
    Private _Items as new ImageListBoxItemCollection
    Public Readonly Property Items as ImageListBoxItemCollection
       Get
          return _Items
       End Get
    End Property

End Class

Je voudrais donc savoir comment les modifications apportées à Items doivent être intercepté pour mettre à jour l'affichage (dans l'événement Paint du controle par exemple).

Les solutions que j'ai déjà utilisé:
- Ajouter des événements à la collection ImageListBoxItemCollection pour signaler un ajout, une suppression ou une modification d'un Item. Solution que je pense correcte si on à de toute facon l'intention d'y implémenter ces événement publique
- Créer une collection dérivé ou on implémente des événements signalant les modifications. Ca permet de ne pas les rendres accessibles publiquement
- Créer une collection dérivé de ImageListBoxItemCollection, et lui ajouter une nouvelle propriété servant à définir un objet qui permet de dessiner sur le control (un renderer), et enfin, faire des OverRides (Les membres de la classe de base doivent être déclaré OverRidable) ou OverLoader tous les membres qui modifient la liste et y ajouter du code qui modifie l'affichage (à travers le renderer).Déclarer la collection interne (private) du control avec cette classe dérivée, mais faire un cast vers la classe de base dans la propriété publique Items.

Voilà pour les modifications de la collection, c'est pas bien compliqué jusqu'à là. Ou ça se complique, c'est lorsque on veut savoir qu'une propriété d'un des items de la collection à changé. Ben oui, ces items ont des propriétés définissants leur apparence (Text, BackColor, ForeColor, Image...) et on doit donc forcément savoir lorsque elles changent...

- Implémenter les événements Changed (TextChanged, ImageChanged, BackColorChanged...) dans l'Item. Lorsque un Item est ajouté à la collection, ajouter un Handler pour chaque événement qui nous intéresse pour pouvoir changer l'affichage, et le renlever lorsque l'item est supprimé.
- Sinon, comme avant, en créant des dérivés pour chaque item... qu'il faudra créer à chaque ajout d'item a la collection. Ca donne pas mal de code.


Bon je crois que je vais terminer là le développement de mon idée la dessus, mais j'ai encore quelques d'autres questions :)

Lorsque une propriété est une liste générique ou une de ses dérivés, on a une boite de dialogue très utile qui apparait lorsque on édite cette propriété dans l'IDE en mode création:

Boite de dialogue

Mais lorsque la collection est une classe implémentant ICollection par exemple, celle-ci ne s'affiche pas. Donc ma question est, quel sont les conditions pour que cette boite de dialogue s'affiche, et comment forcer son affichage?

Ensuite, la persistance des items ajoutés. Lorsque on ajoute un item à notre collection, en mode création toujours, ces items ne restent pas dans la collection. Comment faire pour qu'ils y reste, même si on ferme la solution? (j'avais fais ça en VB6 il y a longtemps)


Le mieux serait d'avoir le code source d'un control de type liste complet qui implémente toutes ces possibilités comme exemple, mais je trouve pas ^^

Ma question n'est pas "Comment peut-on faire", mais plutot "Comment doit-on faire" pour cette histoire de mise à jour de l'affichage.


Alors si qqun aurait qqch à dire là dessus, genre un gars de chez microsoft qui pourrait me refiler le code source d'une listview, serait bien sympa ;)

Je vous remercie d'avance
mardi 18 décembre 2007 à 19:30:43 | Re : Création d'un controle type liste

Kevin.Ory

Hé ben, mon post n'a pas eu le succès escompté

Ma fois, je continuerai à faire mes contrôles "comme je le sens"

Pour mes questions secondaires, c'est a dire l'affichage de l'éditeur de collection et la persistance des items, j'ai trouvé des réponses:

Affichage de l'éditeur de collection:

Utiliser l'attribut <EditorAttribute()>

Exemple:
<EditorAttribute(GetType(System.ComponentModel.Design.CollectionEditor), GetType(System.Drawing.Design.UITypeEditor))> _
Public Default Readonly Property Items(Index as Integer) as ItemCollection

    ...
End Property


Dans mon cas, j'ai implémenté IList dans ma collection. Avec l'attribut <EditorAttribute()> l'éditeur s'affiche bien, mais la collection est ReadOnly (Bouton Add désactivé)
Je comprends pas pourquoi.. Mais si on hérite de List plutot que d'implémenter IList, c'est OK.

Persistance des items d'un contrôle:

Suffit simplement que les Items soient sérialisables

Exemple:
<Serializable()> _
Public Class GroupListItem
    ...
End Class
mardi 6 janvier 2009 à 11:36:55 | Re : Création d'un controle type liste

GRAND2000

Réponse acceptée !
Il y a un attribut qui peut t'aider :
DesignTimeVisible(true)
cet article est d'une grande utilité;
[ Lien ]
mardi 6 janvier 2009 à 18:45:01 | Re : Création d'un controle type liste

Kevin.Ory

Voilà qui est très intéressant en effet.
Merci d'avoir pris la peine de me donner ce lien, ceci peut être fort utile même si mon post date de plus d'un an

++


Cette discussion est classée dans : liste, controle, item, collection, items


Répondre à ce message

Sujets en rapport avec ce message

items des comboBox sous VBA [ par pearl ] j'ai initialisé mon form en ajoutant une liste d'item à mon combo.N'ayant pas la liste complete de tous les items, je voudrais que quand l'utilisateur AVOIR LE CONTROLE ACTIVEX ... [ par HARBAT ] j'ai besoin d'avoir un contrôle activeX composé d'une ligne de saisie et d'une liste (exemple:listeview)qui sont les deux attachés. autrement dit une Problème sur une Liste ! [ par minipod ] J'ai un programme qui ajoute une ligne dans une liste à chaque fois qu'il fait une action.Le problème, c'est que ma liste affiche toujours les items d vider une liste VBA [ par yaya31 ] Bonjour aux leve tot!hier j ai demandé comment on vidait une liste on m a dit for i=0 to fin de listlist.item(i)=""next iMais je pense que c est du VB Gros problème avec set Item dans Collection [ par fio ] Bonjour,J'ai un gros problème avec ma collection, pour laquelle j'ai défini :Public Function Item(Mot As Variant) As clsMots On Error Resume Next Supprimer un item dans une ComboBox [ par Calamax ] Salut tout le monde !Un p'tit message à la fraiche, pour vous réveiller les neuronnes ! J'ai fais une recherche dans les questions déjà posé, je n'ai Pb avec ITEM ds les collection [ par chris81 ] Public ReadOnly Property Item(ByVal key As Integer) As Carton Get Item = MyCollection(key) Return Item End GetEnd Propertysachant que c Je veu ajouter d item sa marche pas! [ par neo00neo ] Voila mes ligne de commande :Forms!FormulaireTest!Liste.AddItem "toto"sa sa marche pas!!!!!!ou Liste.AddItem "toto" et la sa m ecri "méthode non trouv flexgrid: couleur cellule? [ par loskiller62 ] CoucouJ'aimerais savoir si c'est possible, et si oui comment faire pour colorier une ligne de cellules (ou une cellule qu'importe) dans un controle MS 3 questions access : findfirst;selection item dans liste;requery ! [ par coconetup ] Bonjour !Voilà, j'ai trois questions : 1.Comment écrire un findfirst avec plusieurs critères...et si ça n'est pas possible, comment positionner le rec


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,685 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales