TreeNode Опция правого клика - PullRequest
       14

TreeNode Опция правого клика

4 голосов
/ 18 сентября 2009

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

Спасибо, Вирен

Ответы [ 2 ]

6 голосов
/ 18 сентября 2009

Добавить обработчик для MouseUp. В обработчике проверьте args для правой кнопки мыши, вернитесь, если это не так. Вызовите 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 голосов
/ 18 сентября 2009

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

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

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