Question

Je travaille sur un WinForm et sur mon interface utilisateur il y a une vue arborescente, je trouve que le treenode est mis en évidence même que je n'ai pas cliqué sur le nœud par la souris (par exemple, Noeud1 sera mise en surbrillance lorsque je clique sur les points suivants la position), mais je ne aime pas vraiment ce comportement parce que je veux afficher un menu contextuel différent quand je ne clique sur un treenode

  

+ RootNode

  |_ Node1                [ Right Click Here, Node1 will be highlighted]
  |
  |_ Node2                [ Right Click Here, Node2 will be highlighted]
Était-ce utile?

La solution 3

J'ai trouvé une autre méthode pour éviter que le noeud est fort lorsque l'utilisateur ne pas cliquer sur le nœud, et je ne régler la BackColor et ForeColor pour chacun des noeuds lors de l'ajout à l'arbre

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

Ensuite, en cas 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;
 } 

Autres conseils

Voulez-vous hors de votre commentaire à la réponse de Kevin Wienhold, vous voulez juste pour permettre à l'utilisateur de cliquer dans l'espace vide de l'arborescence et désélectionner un nœud sélectionné.

Vous pouvez le faire en manipulant le événement MouseDown du contrôle TreeView et réglage de la HitTest pour déterminer quel noeud est situé à un moment donné, en précisant l'emplacement de l'événement de la souris comme point de test. Vous n'avez pas besoin tout autre code pour sélectionner des nœuds comme d'habitude lorsque l'utilisateur Finalité cliquez sur eux; qui est géré automatiquement par le TreeView.


EDIT: Comme mon commentaire à la question indique, je suis toujours exceptionnellement clair quant à ce que vous essayez d'accomplir ici. Si vous êtes réellement intéressé à empêcher un nœud d'être temporairement mis en évidence pendant que vous maintenez le bouton droit de la souris dans l'espace vide du côté du noeud, les choses deviennent un peu plus complexe.

Je l'ai regardé dans ce problème avant, et la partie la plus délicate est que les messages de fenêtre ne sont pas reçus alors que le bouton de la souris est maintenu enfoncé, du moins jusqu'à ce que la souris est déplacé (dans ce cas, le nœud n'est plus choisi de toute façon). Ce comportement est apparemment dicté par le système d'exploitation et peuvent difficilement être supplantés en utilisant les événements standard fournis .NET. Vous pouvez essayer d'annuler un clic du bouton droit en cas de MouseDown toute la journée, mais le nœud est sélectionné par Windows avant cet événement est toujours élevé dans votre contrôle (rappelez-vous que les contrôles fournis par .NET comme le TreeView et ListView sont simplement des emballages autour de ces mêmes contrôles fournis par l'API Windows qui implémente apparemment ce « select-nœud-tout-bouton-détenus en bas à droite » comportement lui-même).

Qu'est-ce que Finalité travail, cependant, est primordial WndProc dans un contrôle TreeView dérivé, et la manipulation du message WM_RBUTTONDOWN . Mais remarquez que la mise en même la propriété SelectedNode à null ne fonctionne pas ici, car ce n'est pas traitée jusqu'à ce que après de Windows sélectionne automatiquement le noeud en réponse au bouton droit de la souris étant cliqué, peu importe ce que vous faites , vous devez empêcher le contrôle de la base TreeView de réception du message de WM_RBUTTONDOWN. Donc, vous avez deux choix dans la façon de gérer cela:

  1. Vous pouvez simplement annuler le message clic droit par écoper tôt une déclaration de return. Bien sûr, cela signifie que vous ne vont pas être en mesure de gérer cet événement dans votre gestionnaire de MouseDown, car il n'a jamais fait passer au contrôle! Donc, si vous voulez afficher un menu contextuel pop-up, ce ne sera probablement pas le travail 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 le menu contextuel dans la méthode WndProc surchargée en réponse au message de WM_RBUTTONDOWN, puis return de la méthode sans permettre à la classe de base pour gérer le message. Cela fait la chose exactement la même que la première solution (l'événement empêche clic droit de provoquer le nœud soit activée), mais il ne permetvous pour afficher un menu contextuel (ou quoi que ce soit d'autre que vous voulez) chaque fois que le clic droit se produit. Bien sûr, cela signifie que tout le code concerné devra être contenu dans votre sous-classe du contrôle TreeView, non traitées dans le code interface utilisateur de votre formulaire, qui peut ou peut ne pas être pratique 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)
            {
                //Create and show a context menu
                var myContextMenu = new ContextMenuStrip();
                myContextMenu.Items.Add("First Item");
                myContextMenu.Items.Add("Second Item");
                return;
            }
            base.WndProc(ref m);
        }   
    }
    
  3. Vous pouvez augmenter votre propre RightMouseClick événement de votre classe TreeView personnalisée en tant que réponse au message de WM_RBUTTONDOWN, que vous pouvez ensuite gérer comme vous le souhaitez à partir du code interface utilisateur de votre formulaire. En ne passant pas le message WM_RBUTTONDOWN à la classe de contrôle de base TreeView, ce accomplit le même but que les deux précédentes suggestions, mais vous permet de gérer l'événement clic droit bouton dans le code de l'interface utilisateur de votre formulaire au lieu d'avoir à mettre tout votre logique en le WndProc du contrôle sous-classé.

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

essayer cette

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

Si je vous comprends bien, vous voulez pas de noeud à sélectionner si l'utilisateur clique dans l'espace vide dans le TreeView. Vous pouvez accomplir cela en manipulant le MouseDown-événement de l'arbre et définissant la propriété selectedNode de l'arbre à TreeView.GetNodeAt (e.Location).

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