Найти узел щелкнул под контекстное меню

голоса
61

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

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

Задан 05/08/2008 в 17:21
источник пользователем
На других языках...                            


9 ответов

голоса
83

Вы можете добавить событие щелчка мыши к 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);
        }
    }
}
Ответил 05/08/2008 d 17:36
источник пользователем

голоса
19

Вот мое решение. Поместите эту строку в NodeMouseClick случае TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Ответил 09/12/2010 d 00:05
источник пользователем

голоса
11

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

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

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

  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 );
           }
        }
     }
  }
Ответил 11/12/2008 d 22:10
источник пользователем

голоса
6

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

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Ответил 02/01/2013 d 20:41
источник пользователем

голоса
2

Это очень старый вопрос, но я до сих пор нашел, что это полезно. Я использую сочетание некоторых из перечисленных выше ответов, потому что я не хочу, чтобы щелкнуть правой кнопкой мыши узел, чтобы стать selectedNode. Если у меня есть корневой узел выбран и хотите удалить один из его детей, я не хочу, чтобы ребенок выбран, когда я удалить его (я также делаю некоторую работу над 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);
}
Ответил 06/12/2016 d 19:42
источник пользователем

голоса
2

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

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;

Тогда в случае открытия Контекстного в свойство TreeView.SelectedNode будет отражать правильный узел.

Ответил 21/11/2012 d 23:10
источник пользователем

голоса
0

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

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

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

Ответил 12/12/2016 d 20:30
источник пользователем

голоса
0

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

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Ответил 29/05/2014 d 23:11
источник пользователем

голоса
0

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

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

Ответил 08/08/2008 d 15:04
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more