2009-09-18 7 views
4

Je travaille avec TreeView et TreeView.Nodes dans mon application C# GUI et je souhaite utiliser la fonctionnalité de clic droit sur quelques nœuds de mon arborescence. J'ai cherché un peu mais il semble que le SelectedNode n'est valide que pour un clic gauche et qu'il n'y a rien pour capturer le clic droit sur un nœud. Je souhaite ajouter des fonctionnalités telles que 'Ajouter', 'Supprimer', 'Renommer', etc. aux nœuds lorsque vous cliquez avec le bouton droit de la souris. Des conseils s'il vous plaît?Option clic droit TreeNode

Merci, Viren

+0

Utilisez-vous Windows Forms ou WPF? –

+0

Oui formes de fenêtres. Désolé oublié de mentionner cela. Et Visual Studio 2005. – zack

Répondre

6

Ajouter un gestionnaire pour MouseUp. Dans le gestionnaire, vérifiez les arguments pour un bouton droit de la souris, retour si ce n'est pas le cas. Appelez treeView.GetNodeAt() avec les coordonnées de la souris pour trouver le nœud. Créez un menu contextuel.

est ici quelque chose de similaire pour un contrôle de liste qui peut être adapté pour une TreeView:

 private void listJobs_MouseUp(object sender, MouseEventArgs e) 
     { 
      if (e.Button == MouseButtons.Right) 
      { 
       int index = listJobs.IndexFromPoint(e.Location); 
       if (index != ListBox.NoMatches) 
       { 
        listJobs.SelectedIndex = index; 

        Job job = (Job)listJobs.Items[index]; 

        ContextMenu cm = new ContextMenu(); 


        AddMenuItem(cm, "Run", QueueForRun, job).Enabled = !job.Pending; 
        AddMenuItem(cm, "Cancel run", CancelQueueForRun, job).Enabled = (job.State == JobState.Pending || job.State == JobState.Running); 
        AddMenuItem(cm, "Open folder", OpenFolder, job); 

        cm.Show(listJobs, e.Location); 
       } 
      } 
     } 

     private MenuItem AddMenuItem(ContextMenu cm, string text, EventHandler handler,  object context) 
     { 
      MenuItem item = new MenuItem(text, handler); 
      item.Tag = context; 
      cm.MenuItems.Add(item); 
      return item; 
     } 

Vous devrez peut-être utiliser PointToClient ou PointToScreen sur le formulaire de traduire les coordonnées de façon appropriée. Vous réaliserez rapidement si vous en avez besoin lorsque le menu contextuel apparaît au mauvais endroit.

+0

J'ai essayé d'utiliser votre code et cela ne fonctionne pas. Je change votre code pour mon plus simple au départ comme suit: vide treeView1_MouseUp (expéditeur d'objet, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { treeView1.SelectedNode = treeView1.GetNodeAt (eX, eY); Console.WriteLine ("Clic droit"); } } Même ce simple morceau de code ne semble pas fonctionner. Pouvez-vous s'il vous plaît signaler le problème exact. Quand je fais un clic droit sur un nœud dans l'arbre, il ne sélectionne même pas ce nœud. – zack

+0

Salut, merci Scott. Cela fonctionne bien maintenant. J'ai oublié d'enregistrer mon gestionnaire d'événements auto-écrit avec l'application mes formulaires GUI. Ma faute. – zack

+0

Beau travail. Je suis content que tu l'aies résolu. –

0

Utilisez la propriété ContextMenuStrip sur le TreeView pour ajouter un menu contextuel. Si vous n'avez pas besoin d'afficher le menu pour certains des nœuds, vous pouvez gérer l'événement Opening de ContextMenuStrip pour l'empêcher de s'afficher - ou vous pouvez également désactiver certaines options du menu.

Edit: pour saisir le nœud sous la souris, gérer l'événement MouseUp sur le TreeView, et utiliser ce code:

TreeNode nodeUnderMouse = tvMyTreeView.GetNodeAt(e.X, e.Y);
+0

MouseUp se déclenche uniquement après l'événement d'ouverture, de sorte que cela ne fonctionne pas. Il semble qu'il n'y ait aucun moyen d'adapter le menu contextuel incorporé dans l'arborescence avant de l'afficher. – Nyerguds

Questions connexes