Trouver nœud cliqué dans le menu contextuel

voix
61

Comment puis-je savoir quel noeud dans une liste d'arborescence du menu contextuel a été activé? Par exemple, un clic droit un nœud et en sélectionnant une option dans le menu.

Je ne peux pas utiliser les TreeViews de SelectedNodela propriété parce que le noeud est seulement été cliquée droit et non sélectionné.

Créé 05/08/2008 à 17:21
source utilisateur
Dans d'autres langues...                            


9 réponses

voix
83

Vous pouvez ajouter un événement de clic de souris sur la TreeView, puis sélectionnez le nœud approprié à l'aide GetNodeAt donné la souris coordonnées fournies par les 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);
        }
    }
}
Créé 05/08/2008 à 17:36
source utilisateur

voix
19

Voici ma solution. Mettez cette ligne en cas NodeMouseClick du TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Créé 09/12/2010 à 00:05
source utilisateur

voix
11

Je trouve les fenêtres d'un comportement normal de sélection du comportement TreeView être assez ennuyeux. Par exemple, si vous utilisez Explorer et faites un clic droit sur un nœud et cliquez sur Propriétés, il met en évidence le nœud et affiche les propriétés de dialogue pour le nœud sur lequel vous avez cliqué. Mais quand vous revenez de la boîte de dialogue, le noeud a été mis en évidence le nœud précédemment sélectionné / mis en évidence avant que vous avez fait le clic droit. Je trouve cela pose des problèmes d'utilisabilité parce que je suis confus pour toujours être si j'agi sur le nœud droit.

Ainsi, dans beaucoup de nos interfaces graphiques, nous changeons le nœud d'arborescence sélectionné sur un clic droit afin qu'il n'y ait pas de confusion. Cela peut ne pas être la même que celle d'une application standard iwndos comme Explorer (et je tendance à modéliser fortement notre comportement GUI après des applications de fenêtre standard pour des raisons usabiltiy), je crois que ce cas une exception résulte beaucoup plus d'arbres utilisables.

Voici un code qui change la sélection au cours du clic droit:

  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 );
           }
        }
     }
  }
Créé 11/12/2008 à 22:10
source utilisateur

voix
6

Raviver cette question parce que je trouve cela une solution beaucoup mieux. J'utilise l' NodeMouseClickévénement au lieu.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Créé 02/01/2013 à 20:41
source utilisateur

voix
2

C'est une question très ancienne, mais je trouve encore utile. J'utilise une combinaison de quelques-unes des réponses ci-dessus, parce que je ne veux pas le nœud clic droit pour devenir le selectedNode. Si je le nœud racine sélectionné et que vous souhaitez supprimer l'un de ses enfants, je ne veux pas que l'enfant sélectionné quand je le supprimer (je fais aussi des travaux sur le selectedNode que je ne veux pas arriver sur une droite Cliquez sur). Voici ma contribution:

// 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);
}
Créé 06/12/2016 à 19:42
source utilisateur

voix
2

Semblable à la réponse de Marcus, ce fut la solution que j'ai trouvé a fonctionné pour moi:

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

Vous devez pas montrer le menu contextuel vous-même si vous le réglez sur chaque nœud individuel comme ceci:

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

Puis à l'intérieur de l'événement d'ouverture du ContextMenu, la propriété TreeView.SelectedNode reflète le nœud correct.

Créé 21/11/2012 à 23:10
source utilisateur

voix
0

Une autre option que vous pouvez exécuter avec est d'avoir une variable globale qui a le noeud sélectionné. Vous juste besoin d'utiliser le TreeNodeMouseClickEventArgs.

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

Maintenant, vous avez accès à ce nœud et ses propriétés.

Créé 12/12/2016 à 20:30
source utilisateur

voix
0

Voici comment je le fais.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Créé 29/05/2014 à 23:11
source utilisateur

voix
0

Si vous voulez que le menu contextuel pour dépendre de l'élément sélectionné, vous êtes le meilleur mouvement que je pense est d'utiliser le code de Jonesinator pour sélectionner l'élément cliqué. Le contenu de votre menu contextuel peut alors dépendre de l'élément sélectionné.

La sélection de l'élément premier plutôt que de simplement l'utiliser pour le menu contextuel donne quelques avantages. La première est que l'utilisateur dispose d'une indication visuelle à laquelle il a cliqué et donc quel élément le menu est associé. La seconde est que cette façon, il est un enfer de beaucoup plus facile de garder compatible avec d'autres méthodes d'invoquer le menu contextuel (par exemple des raccourcis clavier).

Créé 08/08/2008 à 15:04
source utilisateur

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