Question

Comment puis-je savoir quel nœud dans une arborescence 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 SelectedNode propriété car le nœud a uniquement fait l'objet d'un clic droit et n'est pas sélectionné.

Était-ce utile?

La solution

Vous pouvez ajouter un événement de clic de souris au TreeView, puis sélectionner le nœud correct à 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);
        }
    }
}

Autres conseils

Voici ma solution.Mettez cette ligne dans l'événement NodeMouseClick du TreeView :

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

Je trouve que le comportement de sélection du comportement de l'arborescence Windows standard est 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 fassiez le clic droit.Je trouve que cela pose des problèmes d'utilisabilité car je ne sais toujours pas si j'ai agi sur le bon nœud.

Ainsi, dans bon nombre de nos interfaces graphiques, nous modifions le nœud d'arborescence sélectionné par un clic droit afin d'éviter toute confusion.Ce n'est peut-être pas la même chose qu'une application iwndos standard comme Explorer (et j'ai tendance à modéliser fortement notre comportement GUI après les applications de fenêtre standard pour des raisons d'utilisation), je pense que ce cas d'exception donne lieu à des arbres beaucoup plus utilisables.

Voici un code qui modifie 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 );
           }
        }
     }
  }

Je relance cette question car je trouve que c'est une bien meilleure solution.Je utilise l NodeMouseClick événement à la place.

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

Semblable à la réponse de Marcus, voici la solution qui a fonctionné 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 suit :

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

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

C'est une très vieille question, 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 souhaite 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 qu'il se produise à 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);
}

Si vous souhaitez que le menu contextuel dépende de l'élément sélectionné, la meilleure solution est, je pense, 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é.

Sélectionner d'abord l'élément au lieu de simplement l'utiliser pour le menu contextuel offre quelques avantages.La première est que l'utilisateur a une indication visuelle sur lequel 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'appel du menu contextuel (par ex.Raccourcis clavier).

Voici comment je procède.

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

Une autre option que vous pouvez utiliser est d'avoir une variable globale contenant le nœud sélectionné.Il vous suffirait d'utiliser le TreeNodeMouseClickEventArgs.

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top