Encontrar el nodo al que se hizo clic en el menú contextual

votos
61

¿Cómo puedo averiguar qué nodo en una lista de árbol se ha activado el menú contextual? Por ejemplo, haga clic derecho en un nodo y seleccione una opción del menú.

No puedo usar la SelectedNodepropiedad TreeViews porque el nodo solo se ha hecho clic derecho y no se ha seleccionado.

Publicado el 05/08/2008 a las 17:21
fuente por usuario
En otros idiomas...                            


9 respuestas

votos
83

Puede agregar un evento de clic del mouse al TreeView, luego seleccionar el nodo correcto usando GetNodeAt dadas las coordenadas del mouse proporcionadas por 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);
        }
    }
}
Respondida el 05/08/2008 a las 17:36
fuente por usuario

votos
0

Si desea que el menú contextual dependa del elemento seleccionado, lo mejor es mudarse, creo que es utilizar el código de Jonesinator para seleccionar el elemento que se está haciendo clic. El contenido del menú contextual puede depender del elemento seleccionado.

Seleccionar el elemento primero en lugar de simplemente usarlo para el menú contextual brinda algunas ventajas. La primera es que el usuario tiene una indicación visual de en qué clic y, por lo tanto, con qué elemento está asociado el menú. El segundo es que de esta manera es mucho más fácil mantener compatible con otros métodos de invocación del menú contextual (por ejemplo, atajos de teclado).

Respondida el 08/08/2008 a las 15:04
fuente por usuario

votos
11

Encuentro que el comportamiento de selección de comportamiento estándar de windows tree es bastante molesto. Por ejemplo, si está utilizando Explorer y hace clic derecho en un nodo y pulsa Propiedades, resalta el nodo y muestra el diálogo de propiedades para el nodo en el que hizo clic. Pero cuando regresa del diálogo, el nodo resaltado era el nodo previamente seleccionado / resaltado antes de hacer clic con el botón derecho. Encuentro que esto causa problemas de usabilidad porque siempre estoy confundido sobre si actué en el nodo correcto.

Entonces, en muchas de nuestras GUI, cambiamos el nodo de árbol seleccionado haciendo clic con el botón derecho para que no haya confusión. Puede que no sea lo mismo que una aplicación iwndos estándar como Explorer (y tiendo a modelar fuertemente nuestro comportamiento de GUI después de las aplicaciones de ventana estándar por razones de usabilidad), creo que este caso de excepción da como resultado árboles mucho más utilizables.

Aquí hay un código que cambia la selección con el clic derecho:

  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 );
           }
        }
     }
  }
Respondida el 11/12/2008 a las 22:10
fuente por usuario

votos
19

Aquí está mi solución. Poner esta línea en NodeMouseClick caso de TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Respondida el 09/12/2010 a las 00:05
fuente por usuario

votos
2

Al igual que en la respuesta de Marcus, esta fue la solución que encontré trabajado para mí:

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

Usted no tiene que mostrar el menú contextual sí mismo si lo establece en cada nodo individual de este modo:

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

Luego dentro evento de apertura de la ContextMenu, la propiedad TreeView.SelectedNode reflejará el nodo correcto.

Respondida el 21/11/2012 a las 23:10
fuente por usuario

votos
6

La reactivación de esta pregunta porque me parece que esto es una solución mucho mejor. Yo uso el NodeMouseClickevento en su lugar.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Respondida el 02/01/2013 a las 20:41
fuente por usuario

votos
0

Aquí es cómo lo hago.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Respondida el 29/05/2014 a las 23:11
fuente por usuario

votos
2

Esta es una pregunta muy antigua, pero todavía encontró útil. Estoy usando una combinación de algunas de las respuestas anteriores, porque no quiero que el nodo hace clic derecho para convertirse en el SelectedNode. Si tengo el nodo raíz seleccionado y quiero eliminar uno de los niños es, yo no quiero que la niña seleccionada cuando se borra (yo también estoy haciendo un trabajo sobre la SelectedNode que yo no quiero que suceda en una derecha hacer clic). Aquí está mi contribución:

// 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);
}
Respondida el 06/12/2016 a las 16:42
fuente por usuario

votos
0

Otra opción podría ejecutar con es tener una variable global que tiene el nodo seleccionado. Sólo se necesita utilizar el TreeNodeMouseClickEventArgs.

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

Ahora usted tiene acceso a ese nodo y sus propiedades.

Respondida el 12/12/2016 a las 17:30
fuente por usuario

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