2009-09-18 7 views
4

Я работаю с TreeView и TreeView.Nodes в своем графическом приложении C# и хочу использовать функциональность правой кнопки мыши на нескольких узлах моего дерева. Я искал совсем немного, но кажется, что SelectedNode действителен только для щелчка левой кнопкой мыши, и нет ничего, чтобы зафиксировать правый щелчок на узле. Я хочу добавить функциональные возможности, такие как «Добавить», «Удалить», «Переименовать» и т. Д. На узлы при нажатии правой кнопкой мыши. Любые указания, пожалуйста?TreeNode Right Click Option

Спасибо, Viren

+0

Вы используете Windows Forms или WPF? –

+0

Да окна форм. Извините, забыл упомянуть об этом. И Visual Studio 2005. – zack

ответ

6

Добавить обработчик для MouseUp. В обработчике проверьте аргументы правой кнопкой мыши, верните, если это не так. Вызовите treeView.GetNodeAt() с координатами мыши, чтобы найти узел. Создайте контекстное меню.

Вот что-то подобное для управления списком, который может быть адаптирован для 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; 
     } 

Вам может понадобиться использовать PointToClient или PointToScreen на форме, чтобы перевести координаты соответственно. Вы скоро поймете, что вам нужно, когда контекстное меню появится не в том месте.

+0

Я пробовал использовать ваш код, и он не работает. Я изменить свой код, чтобы сделать мой проще изначально следующим образом: недействительным treeView1_MouseUp (объект отправителя, MouseEventArgs е) { если (e.Button == MouseButtons.Right) { treeView1.SelectedNode = treeView1.GetNodeAt (Исх, еу); Console.WriteLine («Щелчок правой кнопкой»); } } Даже этот простой кусок кода, похоже, не работает. Не могли бы вы указать точную проблему. Когда я нажимаю правой кнопкой мыши на узле в дереве, он даже не выбирает этот узел. – zack

+0

Эй, спасибо Скотту. Теперь он отлично работает. Я забыл зарегистрировать обработчик самозанятого события с моим приложением форм GUI. Виноват. – zack

+0

Хорошая работа. Я рад, что вы это решили. –

0

Используйте свойство ContextMenuStrip на TreeView, чтобы добавить контекстное меню. Если вам нужно не показывать меню для некоторых узлов, вы можете обработать событие открытия ContextMenuStrip, чтобы отменить его от показа себя - или вы также можете отключить некоторые параметры меню.

Edit: захватить узел под мышкой, обрабатывать событие MouseUp на TreeView, и использовать этот код:

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

MouseUp запускает только триггеры после открытия, так что это не работает. Кажется, что нет способа адаптировать контекстное меню, включенное в древовидное представление, прежде чем оно будет показано. – Nyerguds