Bonjour à toutes et à tous

J'ai un treeview dans lequel les noeuds sont dans 3 états possibles. A chaque TreeNode est associé un ContextMenuStrip commun (un seul pour le treeview) qui comporte donc 3 items, le but étant de changer l'état du noeud par un autre état.
Dans la réalité, mon nombre d'états est élevé et surtout le nombre de noeuds est susceptible d'être assez élevé.

Je souhaite éviter de changer l'état du noeud par son état initial, ce qui se traduit par la volonté de griser (propriété Enabled) l'item du contextmenustrip associé.

Ca parait simple à faire mais je coince un max du fait d'un fonctionnement par référence et pas par valeur du ContextMenuStrip

En effet, si je grise un item, celà va impacter l'affichage du contextmenustrip pour les autres noeuds. J'ai donc voulu fouiner du côté du clonage d'objet (IClonable) mais je n'ai pas trouvé de réponse à ma question adaptée à ce compo.

J'ai voulu créer une fonction de ce type:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Private Function DuplicateCMS(Byref mypCms As ContextMenuStrip) As ContextMenuStrip
	Dim MyCms As New ContextMenuStrip			
	MyCms.items.AddRange(mypCms.Items)
	Return MyCms
...
Le but étant d'avoir un contextmenustrip 'initial' (aucun item grisé) et un contextmenustrip adapté au noeud lorsqu'il est affiché.

Et bien, à ma grand stupefaction, celà génère une exception d'index car il semble que chaque fois qu'un item.addrange (ou .add dans une boucle for/each) est appelé, le nombre d'items de la source (ici MypCms) est décrémenté d'autant (un peu comme si c'était un move et pas une copie) !

Est ce que quelqu'un à une idée sur la façon de résoudre ce gros problème existentiel ?
Merci par avance de vos réponses.