2012-10-16 2 views
0

Je suis très nouveau pour .NET et j'ai dû écrire un programme dans lequel il y a un TreeView avec différents types de nœuds, chaque type de nœud a un ContextMenuStrip différent, donc je crée plusieurs sorte de ContextMenuStrip et assigner ensuite à un type différent de TreeNode. Maintenant, ma question est, lorsque l'utilisateur affiche un menu contextuel, comment puis-je trouver quel TreeNode était le nœud qui provoque ContextMenuStrip à montrer. J'essaie d'utiliser ContextMenuStrip.SourceControl mais il retourne un TreeView et cela ne m'aide jamais, car je sais que ma source est TreeView Je veux savoir quel nœud de la vue! Maintenant devrais-je utiliser une sorte de test de réussite? et si oui, qu'en est-il de ContextMenu qui s'affiche à l'aide du clavier?Comment déterminer le contrôle qui cause ContextMenuStrip

+0

Pourriez-vous nous montrer un code –

+0

double possible de [ContextMenuStrip.Owner null Propriété lors de la récupération De Nested ToolStripMenuItem] (http://stackoverflow.com/questions/ 12094528/contextmenustrip-owner-propriété-null-when-retrieving-from-nested-toolstripmenuit) –

+0

Comment cela est-il lié à cette question ?? avez-vous déjà lu la question? Je veux trouver un noeud qui a provoqué l'instanciation du menu. Comment est-ce lié à trouver un menu de ses articles ???? – BigBoss

Répondre

0

Vous pouvez utiliser la propriété Tag pour "lier" les nœuds source. Par exemple, dans le gestionnaire d'événements de chargement de votre formulaire:

private void Form1_Load(object sender, EventArgs e) 
    { 
     TreeNode rootNode = treeView1.Nodes[0];   

     rootNode.Nodes[0].ContextMenuStrip = contextMenuStrip1; 
     contextMenuStrip1.Tag = rootNode.Nodes[0]; 

     rootNode.Nodes[1].ContextMenuStrip = contextMenuStrip2; 
     contextMenuStrip2.Tag = rootNode.Nodes[1]; 
    } 

Ensuite, vous pouvez lier tous les contrôles ContextMenuStrip gestionnaires d'événements Ouvert à une méthode, comme ci-dessous:

private void contextMenuStrip_Opened(object sender, EventArgs e) 
    { 
     ContextMenuStrip cms = sender as ContextMenuStrip; 
     TreeNode aNode = cms.Tag as TreeNode; 
     if (aNode != null) 
     { 
      MessageBox.Show(aNode.Text); 
     } 
    } 

Il pourrait y avoir de meilleures façons de faire mais je pense que cela devrait être capable de résoudre votre problème.

Mise à jour 17/10/2012:

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      contextMenuStrip1.Tag = e.Node; 
     } 
    } 

    private void contextMenuStrip1_Opened(object sender, EventArgs e) 
    { 
     ContextMenuStrip cms = sender as ContextMenuStrip; 
     TreeNode aNode = cms.Tag as TreeNode; 
     if (aNode == null) 
     { 
      aNode = treeView1.SelectedNode; 
     } 
     MessageBox.Show(aNode.Text); 
    } 

    private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e) 
    { 
     ContextMenuStrip cms = sender as ContextMenuStrip; 
     cms.Tag = null; 
    } 
+0

De cette façon un selon votre code je devrais utiliser une douzaine de ContextMenuStrip pour une douzaine de noeuds !! Mais je n'ai que sur ContextMenuStrip par type de nœud et c'est la source du problème – BigBoss

+0

Je ne vois pas où est la différence entre un et plusieurs contrôles ContextMenuStrip. Avec la même méthode qui utilise la propriété Tag, vous devez disposer d'un contrôle suffisant sur la source de l'événement. Ou peut-être que j'ai raté quelque chose. Si vous voulez montrer du code, je pourrais savoir où est le problème. –

+0

Lorsque vous avez plusieurs ContextMenuStrip, vous pouvez définir la propriété 'Tag' pour chaque ContextMenuStrip à un nœud spécifique, mais sinon, vous avez juste un ContextMenuStrip pour de nombreux nœuds. Maintenant, comment devriez-vous mettre Tag au nœud approprié ?? – BigBoss

Questions connexes