2010-11-08 8 views
2

Je travaille avec un contrôle .NET Treeview (pas WPF, mais régulièrement des winforms) et j'ai des problèmes avec l'événement de clic droit (ou tout événement de clic) non tir lorsque le contrôle n'a pas de nœuds à l'intérieur de celui-ci. Selon la réponse à another thread sur Stackoverflow, mon code de gestionnaire d'événements est la suivante:.NET Treeview n'envoie pas l'événement click sur le contrôle vide

private void tvTest_MouseClick(object sender, MouseEventArgs e) 
    { 
     // Note: this block below is needed so that the menu appears on 
     // the correct node when right-clicking. 
     if (e.Button == MouseButtons.Right) 
     { 
      tvTest.SelectedNode = tvTest.GetNodeAt(e.X, e.Y); 
      if (tvTest.SelectedNode != null) 
      { 
       tvTestContextMenuStrip.Show(tvTest, e.Location); 
      } 
      else 
      { 
       tvTestContextMenuStrip.Show(tvTest, tvTest.Location); 
      } 
     } 
    } 

Le problème vient que si cela fonctionne bien lorsque les nœuds sont présents, si le contrôle est vide, je ne peux pas droite cliquez sur le contrôle et choisissez "ajouter un noeud" pour l'ajouter à la racine. Le gestionnaire n'est pas entré AT ALL, car j'ai placé un point d'arrêt juste au début, et il semble que la méthode n'est jamais entrée.

Est-ce que quelqu'un sait comment faire "quelque chose" quand l'arborescence est vide?

+0

Utilisez-vous un menu contextuel pour ajouter des nœuds? Est-ce ce que vous vous attendez à faire apparaître lorsque l'arbre ne contient aucun noeud? – Bernard

+0

Cela fonctionne très bien s'il y a un nœud, et non si l'arborescence contient des nœuds zéro. Donc, le menu est bien, c'est l'événement MouseClick qui ne fonctionne pas pour moi. –

+0

Le contrôle 'TreeView' est fait spécifiquement pour gérer' TreeNode's. Essayez de placer/montrer un contrôle "fantôme" sur l'arborescence quand il ne contient aucun nœud. – Vercas

Répondre

3

J'étais curieux au sujet de ce problème particulier que vous avez décrit ainsi j'ai créé un nouveau projet puis ai ajouté un contrôle Treeview au formulaire.

J'ai ensuite créé un gestionnaire d'événements pour l'événement MouseDown, et l'ai fait afficher un message, lorsque le bouton droit est enfoncé. Si vous avez besoin du code que je suis heureux de fournir sur demande, basé sur le fait qu'il s'agit d'environ 2 lignes et Visual Studio a créé la méthode de l'événement, je ne vois pas le point.

+0

Merci l'homme. Fonctionne assez bien. Encore quelques morceaux d'étrangeté de création/suppression, mais cela peut être plus sur la façon dont je le fais. Vous avez résolu le problème fondamental. –

+1

Si vous avez d'autres questions, assurez-vous de les poser. Vous pouvez contourner ce problème en ajoutant un nœud par défaut s'il n'y a pas de données réelles à afficher. –

3

Je ne pense pas que cela a été explicitement identifié ci-dessus, mais l'affiche originale Implique qu'il utilise MouseClick de son code:

private void tvTest_MouseClick 

Mais la réponse répond avec une réponse à utiliser MouseDown:

J'ai ensuite créé un gestionnaire d'événements pour l'événement MouseDown ...

j'ai pu reproduire le problème d'origine en utilisant MouseClick. Il semble que MouseClick n'est levé que si l'on clique sur un nœud, mais que le MouseDown est levé, que vous soyez sur un nœud ou pas, ce qui vous permet de choisir l'un ou l'autre selon le comportement que vous voulez.