treeview noeud est mis en évidence même si je n’ai pas un clic droit sur le noeud

Je suis en train de travailler sur un winform et sur mon interface utilisateur, il y a un arbre, j’ai constaté que le code vert sera mis en évidence même si je n’ai pas cliqué sur le noeud avec le bouton droit de la souris (par exemple, Node1 sera mis en surbrillance lorsque je clique sur la position suivante), mais je n’aime vraiment pas ce comportement parce que je veux montrer un menu contextuel différent quand je ne clique pas sur un code

+ RootNode

|_ Node1 [ Right Click Here, Node1 will be highlighted] | |_ Node2 [ Right Click Here, Node2 will be highlighted] 

En laissant de côté votre commentaire sur la réponse de Kevin Wienhold, vous voulez simplement permettre à l’utilisateur de cliquer dans l’espace vide de l’arborescence et de désélectionner tout nœud sélectionné.

Pour ce faire, vous devez gérer l’ événement MouseDown du contrôle TreeView et définir la propriété SelectedNode sur la valeur null si vous avez cliqué avec la souris sur un emplacement ne contenant pas de nœud. Par exemple, vous pouvez utiliser le code suivant:

 private void myTreeView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (myTreeView.HitTest(e.Location).Node == null) { myTreeView.SelectedNode = null; } } 

Ceci tire parti de la méthode HitTest pour déterminer quel nœud se situe à un point particulier, en spécifiant l’emplacement de l’événement de la souris en tant que point à tester. Vous n’avez besoin d’aucun autre code pour sélectionner les nœuds comme d’habitude lorsque l’utilisateur clique dessus; qui est géré automatiquement par le TreeView .


EDIT: Comme mon commentaire à la question l’indique, je ne suis toujours pas très clair sur ce que vous essayez d’accomplir ici. Si vous souhaitez réellement éviter qu’un nœud ne soit temporairement mis en surbrillance pendant que vous maintenez le bouton droit de la souris enfoncé dans l’espace vide situé à côté du nœud, la situation devient un peu plus complexe.

J’ai déjà examiné ce problème auparavant, et la difficulté réside dans le fait que les messages de fenêtre ne sont pas reçus tant que le bouton de la souris est enfoncé, du moins tant que la souris n’est pas déplacée (dans ce cas, le nœud n’est plus sélectionné de toute façon) . Ce comportement est apparemment dicté par le système d’exploitation et difficile à remplacer à l’aide des événements standard fournis par .NET. Vous pouvez essayer d’annuler un clic du bouton droit dans l’événement MouseDown toute la journée, mais le nœud est sélectionné par Windows avant que cet événement ne soit déclenché dans votre contrôle (rappelez-vous que des contrôles fournis par .NET, tels que TreeView et ListView simplement des enveloppes autour des mêmes contrôles fournis par l’API Windows, qui implémente apparemment ce comportement de “sélection de nœud tandis que le bouton droit est maintenu enfoncé”).

Ce qui fonctionne, cependant, consiste à WndProc dans un contrôle TreeView dérivé et à gérer le message WM_RBUTTONDOWN . Notez cependant que même si vous définissez la propriété SelectedNode sur la valeur null ne fonctionne pas ici, car elle n’est pas traitée avant que Windows ait automatiquement sélectionné le nœud en réponse au clic du bouton droit de la souris. Quoi que vous fassiez, vous devez empêcher la base TreeView contrôle de recevoir le message WM_RBUTTONDOWN . Donc, vous avez deux choix pour gérer ceci:

  1. Vous pouvez simplement annuler le message du clic droit en enregistrant tôt avec une déclaration de return . Bien entendu, cela signifie que vous ne pourrez pas gérer cet événement dans votre gestionnaire MouseDown , car il n’est en réalité jamais transmis au contrôle! Donc, si vous souhaitez afficher un menu contextuel, cela ne fonctionnera probablement pas pour vous.

     public class NewTreeView : System.Windows.Forms.TreeView { protected override void WndProc(ref System.Windows.Forms.Message m) { const int WM_RBUTTONDOWN = 0x204; if (m.Msg == WM_RBUTTONDOWN) { return; } base.WndProc(ref m); } } 
  2. Vous pouvez afficher votre menu contextuel dans la méthode WndProc remplacée en réponse au message WM_RBUTTONDOWN , puis return de la méthode sans permettre à la classe de base de gérer le message. Cela fait exactement la même chose que la première solution (empêche l’événement de clic droit de faire en sorte que le nœud apparaisse comme sélectionné), mais vous permet d’afficher un menu contextuel (ou de faire tout ce que vous voulez) chaque fois que vous cliquez avec le bouton droit de la souris. se produit. Bien entendu, cela signifie que tout le code pertinent devra être contenu dans votre sous-classe du contrôle TreeView , et non traité dans le code de l’interface utilisateur de votre formulaire, ce qui peut ne pas vous convenir.

     public class NewTreeView : System.Windows.Forms.TreeView { protected override void WndProc(ref System.Windows.Forms.Message m) { const int WM_RBUTTONDOWN = 0x204; if (m.Msg == WM_RBUTTONDOWN) { //Create and show a context menu var myContextMenu = new ContextMenuSsortingp(); myContextMenu.Items.Add("First Item"); myContextMenu.Items.Add("Second Item"); return; } base.WndProc(ref m); } } 
  3. Vous pouvez RightMouseClick votre propre événement RightMouseClick partir de votre classe TreeView personnalisée en réponse au message WM_RBUTTONDOWN , que vous pouvez ensuite gérer à votre guise à partir du code de l’interface utilisateur de votre formulaire. En ne transmettant pas le message WM_RBUTTONDOWN à la classe de contrôle TreeView base, le même objective que les deux suggestions précédentes est atteint, mais vous permet de gérer l’événement de clic du bouton droit dans le code de l’interface utilisateur de votre formulaire au lieu de devoir mettre toute votre logique dans WndProc du contrôle sous- WndProc .

     public class NewTreeView : System.Windows.Forms.TreeView { protected override void WndProc(ref System.Windows.Forms.Message m) { const int WM_RBUTTONDOWN = 0x204; if (m.Msg == WM_RBUTTONDOWN) { //Raise your custom event OnRightMouseClick(new EventArgs()); return; } base.WndProc(ref m); } } 

essaye ça

  void treeView1_MouseDown(object sender, MouseEventArgs e) { TreeViewHitTestInfo h = treeView1.HitTest(e.Location); if (h.Location != TreeViewHitTestLocations.Label && h.Location!= TreeViewHitTestLocations.None ) { treeView1.SelectedNode = null; } } 

J’ai trouvé une autre méthode pour empêcher le nœud d’être en surbrillance lorsque l’utilisateur ne clique pas sur le nœud, et je ne définit que les couleurs BackColor et ForeColor pour chacun des nœuds lors de l’ajout à l’arbre.

 newNode.BackColor = treeview1.BackColor; newNode.ForeColor = treeview1.ForeColor; treeview1.Nodes.Add(newNode); 

Ensuite, dans l’événement MouseDown, définissez la propriété SelectedNode comme suit

  private void treeView1_MouseDown(object sender, MouseEventArgs e) { TreeNode Node = treeView1.GetNodeAt(e.Location); if (Node != null && Node.Bounds.Contains(e.Location)) treeView1.SelectedNode = Node; else treeView1.SelectedNode = null; } 

Si je vous ai bien compris, vous ne souhaitez sélectionner aucun nœud si l’utilisateur clique dans un espace vide de TreeView. Pour ce faire, vous pouvez gérer l’événement MouseDown de l’arborescence et définir la propriété SelectedNode de l’arborescence sur TreeView.GetNodeAt (e.Location).