Encontrar nó clicado no menu de contexto

votos
61

Como posso descobrir qual nó em uma lista de árvore no menu de contexto foi ativado? Por exemplo clicando com o botão direito um nó e selecionando uma opção no menu.

Eu não pode usar os TreeViews' SelectedNodepropriedade porque o nó só é tido razão clicado e não selecionado.

Publicado 05/08/2008 em 17:21
fonte usuário
Em outras línguas...                            


9 respostas

votos
83

Você pode adicionar um evento clique do mouse para o TreeView, em seguida, selecione o nó correto usando GetNodeAt dado o mouse coordenadas fornecidas pelo 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);
        }
    }
}
Respondeu 05/08/2008 em 17:36
fonte usuário

votos
19

Aqui está a minha solução. Coloque esta linha em NodeMouseClick evento da TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Respondeu 09/12/2010 em 00:05
fonte usuário

votos
11

Acho que o comportamento de seleção comportamento padrão do Windows treeview ser bastante irritante. Por exemplo, se você estiver usando Explorer e clique direito em um nó e bater Properties, ele destaca o nó e mostra a janela de propriedades do nó que você clicou. Mas quando você retornar a partir do diálogo, o nó destacado foi o nó selecionado anteriormente / destacado antes que você fez o clique com o botão direito. Acho que isso faz com que problemas de usabilidade, porque eu estou sempre sendo confundido sobre se eu agi no nó direito.

Assim, em muitos dos nossos GUIs, mudamos o nó da árvore selecionado em um clique com o botão direito para que não haja confusão. Isto pode não ser o mesmo que um aplicativo iwndos padrão, como Explorer (e eu tendem a modelar fortemente o nosso comportamento GUI depois de aplicativos janela padrão por razões usabiltiy), acredito que neste caso uma exceção resulta em muito as árvores mais utilizáveis.

Aqui está um código que altera a seleção durante o botão direito:

  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 );
           }
        }
     }
  }
Respondeu 11/12/2008 em 22:10
fonte usuário

votos
6

Revivendo a esta pergunta, porque eu acho que isso seja uma solução muito melhor. Eu uso o NodeMouseClickevento em seu lugar.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Respondeu 02/01/2013 em 20:41
fonte usuário

votos
2

Esta é uma questão muito antiga, mas eu ainda achei que seria útil. Eu estou usando uma combinação de algumas das respostas acima, porque eu não quero que o nó direito clicado para se tornar o SelectedNode. Se eu tiver o nó raiz selecionado e pretende eliminar uma de suas crianças, eu não quero que a criança selecionada quando eu excluí-lo (eu também estou fazendo algum trabalho no SelectedNode que eu não quero que aconteça em uma direita clique). Aqui está a minha contribuição:

// 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);
}
Respondeu 06/12/2016 em 19:42
fonte usuário

votos
2

Semelhante a resposta de Marcus, esta foi a solução que eu encontrei trabalhou para mim:

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

Você não precisa mostrar o menu de contexto si mesmo se você configurá-lo para cada nó individual assim:

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

Então, dentro evento de abertura do ContextMenu, a propriedade TreeView.SelectedNode refletirá o nó correto.

Respondeu 21/11/2012 em 23:10
fonte usuário

votos
0

Outra opção que você poderia correr com é ter uma variável global que tem o nó selecionado. Você só precisa usar o TreeNodeMouseClickEventArgs.

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

Agora você tem acesso a esse nó e suas propriedades.

Respondeu 12/12/2016 em 20:30
fonte usuário

votos
0

Aqui está como eu faço isso.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Respondeu 29/05/2014 em 23:11
fonte usuário

votos
0

Se você deseja que o menu de contexto para ser dependente do item selecionado você é o melhor movimento que eu acho que é a utilização de código de Jonesinator para selecionar o item clicado. Seu conteúdo menu de contexto pode, então, ser dependente do item selecionado.

Selecionando o item primeiro em oposição a apenas usando-o para o menu de contexto dá algumas vantagens. A primeira é que o usuário tem uma indicação visual como a que ele clicou e, portanto, qual item do menu está associado. A segunda é que desta forma é um inferno de muito mais fácil manter compatível com outros métodos de invocar o menu de contexto (por exemplo, atalhos de teclado).

Respondeu 08/08/2008 em 15:04
fonte usuário

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