Найти узел нажал в контекстном меню

Как узнать, какой узел в древовидном списке активировал контекстное меню? Например, щелкнув правой кнопкой мыши узел и выбрав опцию в меню.

Я не могу использовать SelectedNodeсвойство TreeViews, потому что узел только щелкнул правой кнопкой мыши и не выбран.

5.08.2008 16:21:14
9 ОТВЕТОВ
РЕШЕНИЕ

Вы можете добавить событие щелчка мыши в TreeView, затем выбрать правильный узел, используя GetNodeAt, учитывая координаты мыши, предоставленные MouseEventArgs.

void treeView1MouseUp(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Right)
    {
        // Select the clicked node
        treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);

        if(treeView1.SelectedNode != null)
        {
            myContextMenuStrip.Show(treeView1, e.Location);
        }
    }
}
92
11.09.2012 05:38:54
Большое спасибо, у меня есть небольшое дополнение к решению: вы также можете использовать событие «_NodeMouseClick», которое дает вам «TreeNodeMouseClickEventArgs e», и в этом случае вы можете просто использовать e.Node и не беспокоиться о проверке Является ли узел нулевым или нет.
SDM 9.07.2013 14:44:42
Я получил желаемый результат с помощью события MouseDown вместо MouseUp.
Javier 31.07.2013 12:53:51

Если вы хотите, чтобы контекстное меню зависело от выбранного элемента, лучше всего подвигаться, я думаю, чтобы использовать код Jonesinator для выбора элемента, по которому щелкнули. Содержание вашего контекстного меню может зависеть от выбранного элемента.

Выбор пункта сначала вместо использования его для контекстного меню дает несколько преимуществ. Первое состоит в том, что пользователь имеет визуальную индикацию того, с кем он щелкнул и, следовательно, с каким пунктом меню связано. Во-вторых, таким образом намного проще поддерживать совместимость с другими методами вызова контекстного меню (например, сочетания клавиш).

0
8.08.2008 14:04:11

Я считаю, что стандартное поведение выбора вида дерева окон раздражает. Например, если вы используете Проводник, щелкаете правой кнопкой мыши узел и нажимаете «Свойства», он выделяет узел и отображает диалоговое окно свойств для узла, на котором вы щелкнули. Но когда вы вернетесь из диалогового окна, выделенный узел был узлом, ранее выбранным / выделенным до того, как вы щелкнули правой кнопкой мыши. Я считаю, что это вызывает проблемы с юзабилити, потому что я всегда путаюсь, действовал ли я на правильном узле.

Поэтому во многих наших графических интерфейсах мы изменяем выбранный узел дерева по щелчку правой кнопкой мыши, чтобы не было путаницы. Это может не совпадать со стандартным приложением iwndos, таким как Explorer (и я склонен сильно моделировать поведение нашего графического интерфейса после стандартных оконных приложений по причинам юзабилити), я считаю, что это единственное исключение приводит к гораздо более пригодным для использования деревьям.

Вот некоторый код, который изменяет выбор при щелчке правой кнопкой мыши:

  private void tree_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
  {
     // only need to change selected note during right-click - otherwise tree does
     // fine by itself
     if ( e.Button == MouseButtons.Right )
     {         
        Point pt = new Point( e.X, e.Y );
        tree.PointToClient( pt );

        TreeNode Node = tree.GetNodeAt( pt );
        if ( Node != null )
        {
           if ( Node.Bounds.Contains( pt ) )
           {
              tree.SelectedNode = Node;
              ResetContextMenu();
              contextMenuTree.Show( tree, pt );
           }
        }
     }
  }
12
15.02.2011 00:53:58
Это лучшее решение для меня, потому что оно фактически выбирает узел, на который вы нажали.
CAD bloke 13.01.2012 02:07:53

Вот мое решение. Поместите эту строку в событие NodeMouseClick TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
21
8.12.2010 23:05:57
Аргументы событий мыши не имеют .Node
CAD bloke 13.01.2012 02:04:48
Да, но TreeNodeMouseClickEventArgs (которые передаются в событие NodeMouseClick ) делают. Таким образом, мое решение работает и не слишком
deej 21.06.2012 18:17:35

Подобно ответу Маркуса, это решение, которое я нашел, сработало для меня:

private void treeView_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        treeView.SelectedNode = treeView.GetNodeAt(e.Location);
    }
}

Вам не нужно показывать контекстное меню самостоятельно, если вы установите его для каждого отдельного узла следующим образом:

TreeNode node = new TreeNode();
node.ContextMenuStrip = contextMenu;

Затем в событии открытия ContextMenu свойство TreeView.SelectedNode будет отражать правильный узел.

2
21.11.2012 22:10:51

Возрождая этот вопрос, потому что я считаю, что это гораздо лучшее решение. Я использую NodeMouseClickсобытие вместо этого.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
8
2.01.2013 19:41:00
Мне это тоже нравится намного лучше.
Joey Novak 31.01.2017 22:39:34

Вот как я это делаю.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
0
29.05.2014 22:11:10

Это очень старый вопрос, но я все же нашел его полезным. Я использую комбинацию некоторых из ответов выше, потому что я не хочу, чтобы узел, щелкнувший правой кнопкой мыши, стал выбранным узлом. Если у меня выбран корневой узел и я хочу удалить одного из его дочерних элементов, я не хочу, чтобы дочерний элемент был выбран при его удалении (я также выполняю некоторую работу с selectedNode, которую я не хочу выполнять справа). нажмите). Вот мой вклад:

// Global Private Variable to hold right-clicked Node
private TreeNode _currentNode = new TreeNode();

// Set Global Variable to the Node that was right-clicked
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        _currentNode = e.Node;
}

// Do something when the Menu Item is clicked using the _currentNode
private void toolStripMenuItem_Clicked(object sender, EventArgs e)
{
    if (_currentNode != null)
        MessageBox.Show(_currentNode.Text);
}
3
6.12.2016 19:42:55

Другой вариант, с которым вы можете работать - это иметь глобальную переменную с выбранным узлом. Вам просто нужно использовать TreeNodeMouseClickEventArgs.

public void treeNode_Click(object sender, TreeNodeMouseClickEventArgs e)
{
    _globalVariable = e.Node;
}

Теперь у вас есть доступ к этому узлу и его свойствам.

0
12.12.2016 20:30:56