Duplication ToolStripMenuItem

ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 - 19 sept. 2010 à 22:00
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 - 24 sept. 2010 à 22:01
Bonjour a tous,

Je cherche a créer différents ContextMenuStrip associer à des TreeNodes.

Suivant le node, les éléments du ContextMenuStrip sont différents à l'exception d'un ToolStripMenuItem qui est définie aprés une recherche dans différents DataSet.

Afin d'avoir le plus de réactivité possible, je me suis dit que j'aller créer un ToolStripMenuItem nommé ToolCommun (par exemple) dans lequel j'additionne les différents DropDownItems. Ensuite, je pensait faire un Add de ToolCommun dans les différents ContextMenuStrip.

Le résultat que j'obtient est l'ajout du ToolCommun seulement dans le dernier TreeNode créer.

Je suppose donc qu'un ToolStripMenuItem ne peut être associer qu'a un seul ContextMenuStrip.

Quelqu'un aurrait-il une solution pour dupliquer une variable ?

Merci.

4 réponses

foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
20 sept. 2010 à 14:24
Bonjour,

Oui, une instance de ToolStripMenuItem ne peut être associée qu'à un seul ContextMenuStrip.

Il faut cloner l'objet ou créer explicitement une nouvelle instance afin de pouvoir le réutiliser :

ToolCommun.Clone()
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
24 sept. 2010 à 06:10
Merci pour ta réponse foliv57,

la fonction .Clone n'existe pas. En recherchant un peut plus j'ai trouvé une information expliquant que le Clonage est possible pour les MenuItem mais pas pour les ToolStripMenuItem.

Du coup j'ai fait plusieurs ContextMenuStrip et je relie celui qui convient a chaque élément.
Cette méthode me convient pour l'instant car j'ai peu de différence entre les menus. Cependant, je pense que dans les cas où les menus sont plus élaborés la fonction .Clone doit serieusement manqué.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
24 sept. 2010 à 21:00
Désolé, pour l'intox, c'est vrai qu'il n'existe pas de fonction clone sur un ToolStripMenuItem.

Juste une petite suggestion, si j'ai bien compri votre besoin.

Pourquoi ne pas créer un seul ContextMenuStrip personnalisé spécifique à votre treewview qui afficherait les items en fonction du noeud cliqué.

Voici un exemple :
Public Class ContextMenuStripTreeNode
    Inherits ContextMenuStrip

    'Le Context menu strip possède en "permanence" ces deux items
    Private WithEvents ToolCommun As New ToolStripMenuItem("Commun")
    Private WithEvents ToolMagic As New ToolStripMenuItem("Magic")

    Public Sub New()
        Me.InitItems()
    End Sub

    'Mise à diposition du noeud cliqué
    Private _node As TreeNode
    Public ReadOnly Property Node() As TreeNode
        Get
            Return _node
        End Get
    End Property

    'Affichage personnalisé
    Public Overloads Sub Show(ByVal Node As TreeNode)

        'On stoke le noead
        _node = Node

        'On rattache le ContextStrip au noeud
        '(facilite le positionnement du menu)
        _node.ContextMenuStrip = Me

        'Initialisation des items
        Me.InitItems()

        'Test le type de noeud
        If _node.Text = "Noeud1" Then

            'Possibilité d'ajouter des noeuds dynamiques
            Dim item As New ToolStripMenuItem(_node.Name)
            Me.Items.Add(item)
            AddHandler item.Click, AddressOf Tool_Click

        ElseIf _node.Text = "Noeud3" Then

            'Affichage spécifique d'item permanent
            ToolMagic.Visible = True

        End If

        'Affichage du menu
        Me.Show()

    End Sub

    'Initialisation des items
    Public Sub InitItems()
        Me.Items.Clear()
        Me.Items.Add(ToolCommun)
        Me.Items.Add(ToolMagic)
        ToolMagic.Visible = False
    End Sub

    Private Sub ToolCommun_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ToolCommun.Click
        MessageBox.Show("Je suis le commun du noeud " & _node.Text)
    End Sub

    Private Sub ToolMagic_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ToolMagic.Click
        MessageBox.Show("Je suis le magic du noeud " & _node.Text)
    End Sub

    Private Sub Tool_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        MessageBox.Show("Je suis le tool perso du noeud " & _node.Text)
    End Sub

End Class


On pourra utiliser cette class de cette manière :
Public Class Form1

    Private WithEvents cms As New ContextMenuStripTreeNode()

    Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
        If e.Button = Windows.Forms.MouseButtons.Right Then

            cms.Show(e.Node)

        End If
    End Sub

End Class
0
ccito Messages postés 67 Date d'inscription mercredi 5 mai 2010 Statut Membre Dernière intervention 20 mai 2011 1
24 sept. 2010 à 22:01
L'idée est bonne.
Je ne suis pas encore au point sur les class mais je vais essayer.
0
Rejoignez-nous