c# - Rechercher un nœud cliqué dans le menu contextuel

Translate

Comment puis-je savoir quel nœud d'une liste arborescente le menu contextuel a été activé? Par exemple, cliquez avec le bouton droit sur un nœud et sélectionnez une option dans le menu.

Je ne peux pas utiliser les TreeViews 'SelectedNodepropriété car le nœud a été uniquement cliqué avec le bouton droit de la souris et non sélectionné.

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

Vous pouvez ajouter un événement de clic de souris à TreeView, puis sélectionner le nœud approprié à l'aide de GetNodeAt en fonction des coordonnées de souris fournies par 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);
        }
    }
}
La source
Translate

Voici ma solution. Placez cette ligne dans l'événement NodeMouseClick de TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
La source
Translate

Je trouve le comportement standard de sélection du comportement de l'arborescence des fenêtres assez ennuyeux. Par exemple, si vous utilisez l'Explorateur et cliquez avec le bouton droit sur un nœud et appuyez sur Propriétés, il met en surbrillance le nœud et affiche la boîte de dialogue des propriétés du nœud sur lequel vous avez cliqué. Mais lorsque vous revenez de la boîte de dialogue, le nœud en surbrillance était le nœud précédemment sélectionné / mis en surbrillance avant que vous n'effectuiez le clic droit. Je trouve que cela pose des problèmes de convivialité car je ne sais toujours pas si j'ai agi sur le bon nœud.

Ainsi, dans beaucoup de nos interfaces graphiques, nous modifions le nœud d'arbre sélectionné par un clic droit afin qu'il n'y ait pas de confusion. Cela peut ne pas être la même chose qu'une application iwndos standard comme Explorer (et j'ai tendance à modéliser fortement notre comportement d'interface graphique après les applications de fenêtre standard pour des raisons d'utilisation), je pense que ce cas d'exception entraîne beaucoup plus d'arbres utilisables.

Voici quelques codes qui modifient la sélection lors 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 );
           }
        }
     }
  }
La source
Translate

Relancer cette question parce que je trouve que c'est une bien meilleure solution. Je utilise leNodeMouseClickévénement à la place.

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

C'est une question très ancienne, mais je l'ai toujours trouvée utile. J'utilise une combinaison de certaines des réponses ci-dessus, car je ne veux pas que le nœud cliqué avec le bouton droit devienne le nœud sélectionné. Si le nœud racine est sélectionné et que je veux supprimer l'un de ses enfants, je ne veux pas que l'enfant soit sélectionné lorsque je le supprime (je fais également du travail sur le nœud sélectionné que je ne veux pas faire à 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);
}
La source
Translate

Semblable à la réponse de Marcus, c'est la solution que j'ai trouvée qui fonctionnait pour moi:

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

Vous n'avez pas besoin d'afficher le menu contextuel vous-même si vous le définissez sur chaque nœud individuel comme ceci:

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

Ensuite, dans l'événement Opening de ContextMenu, la propriété TreeView.SelectedNode reflétera le nœud correct.

La source
ICR
Translate

Si vous voulez que le menu contextuel dépende de l'élément sélectionné, il est préférable, je pense, d'utiliser le code de Jonesinator pour sélectionner l'élément sur lequel vous avez cliqué. Le contenu de votre menu contextuel peut alors dépendre de l'élément sélectionné.

La sélection de l'élément en premier au lieu de l'utiliser uniquement pour le menu contextuel présente quelques avantages. La première est que l'utilisateur dispose d'une indication visuelle sur laquelle il a cliqué et donc à quel élément le menu est associé. La seconde est que de cette façon, il est beaucoup plus facile de rester compatible avec d'autres méthodes d'invocation du menu contextuel (par exemple les raccourcis clavier).

La source
Translate

Voici comment je fais.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
La source
Translate

Une autre option avec laquelle vous pouvez exécuter est d'avoir une variable globale contenant le nœud sélectionné. Vous auriez juste besoin d'utiliser leTreeNodeMouseClickEventArgs.

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

Vous avez maintenant accès à ce nœud et à ses propriétés.

La source