74 votes

Rechercher un nœud cliqué dans le " menu contextuel

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

Je ne peux pas utiliser les TreeViews' SelectedNode de la propriété parce que le nœud est seulement été cliqué avec le bouton droit et n'est pas sélectionnée.

95voto

Jonesinator Points 1793

Vous pouvez ajouter un clic de souris de l'événement à l'Arborescence, puis sélectionnez le nœud correct à l'aide de GetNodeAt donné les coordonnées de la souris fournie par le 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);
        }
    }
}

21voto

deej Points 351

Voici ma solution. Mettre cette ligne dans NodeMouseClick cas de l'Arborescence:

 ((TreeView)sender).SelectedNode = e.Node;

12voto

Marcus Erickson Points 852

Je trouve le standard de windows treeview comportement le comportement de la sélection pour être assez ennuyeux. Par exemple, si vous utilisez l'Explorateur et cliquez droit sur un nœud et de frapper des Propriétés, il met en évidence le nœud et affiche la boîte de dialogue propriétés du nœud sur lequel vous avez cliqué. Mais lorsque vous revenez à la boîte de dialogue, la mise en surbrillance de noeud est le noeud sélectionné précédemment sélectionné avant que vous ne le clic droit. Je trouve cela provoque des problèmes d'utilisabilité, car je suis toujours en train de s'embrouiller si j'ai agi sur la droite du nœud.

Ainsi, dans beaucoup de nos Interfaces graphiques, nous avons changer l'arbre noeud sur un clic-droit, de sorte qu'il n'y est pas de confusion. Cela peut ne pas être le même qu'un standard iwndos application, tels que l'Explorateur (et j'ai tendance à fortement modèle de notre GUI comportement après le standard de la fenêtre des applications pour usabiltiy raisons), je crois que ce seul cas d'exception résultats dans beaucoup plus utilisable arbres.

Voici un code qui modifie la sélection au cours de la droite, cliquez sur:

  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 );
           }
        }
     }
  }

9voto

Beta Carotin Points 111

La relance de cette question, car je trouve ceci pour être une bien meilleure solution. J'utilise l' NodeMouseClick événement à la place.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}

0voto

ICR Points 6960

Si vous souhaitez que le menu contextuel d'être dépendant de l'élément sélectionné, vous êtes mieux je pense est d'utiliser Jonesinator code pour sélectionner l'élément cliqué. Votre menu contextuel contenu peut ensuite être dépend de l'élément sélectionné.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X