2009-04-05 2 views
1

J'ai créé un morceau de code qui affichera une zone de groupe appropriée correspondant au nœud treeview cliqué comme un formulaire de menu Preferences. Le code fait ce qu'il est censé faire mais mon problème est de trouver comment faire pour qu'un autre groubox ne soit pas vu si un autre élément dans l'arborescence est cliqué avec le bouton droit de la souris.C#: Aide Itérer à travers les éléments treeview via l'événement NodeMouseClick

[Détail]

Disons qu'il ya 3 noeuds dans l'arborescence. 0) Général; 1) les sons; et 2) À propos de; Si je clique sur le nœud [1] Sons, il affichera la boîte de groupe appropriée, mais si je clique droit sur le nœud treeview [0] Général, il affichera son cadre et une fois que je souleve le clic droit sur la souris, le focus reviendra retour à [1] Sons, mais laissez la boîte de groupe pour le noeud 0) Général. Comment pourrais-je éviter cela?

[Code]

private void tvFrames_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     // How would I make sure that it won't display a different groupbox if another treeview node 
     // is currently being right clicked (temporarily selected before reverting back to previous focused node item)? 
     if (e.Node != null) 
     { 
      switch (e.Node.Index) 
      { 
       case 0: 
        ShowGroupBox(groupboxZero); 
        break; 

       case 1: 
        ShowGroupBox(groupboxOne); 
        break; 

       case 2: 
        ShowGroupBox(groupboxTwo); 
        break; 
      } 
     } 
    } 

Répondre

0

La meilleure réponse pourrait être de ne pas utiliser treeView1_NodeMouseClick, mais de s'en tenir à la norme treeView1_AfterSelect.

Vous avez également un BeforeSelect qui pourrait être utile pour enregistrer des données ou annuler le déplacement.

+0

Merci de souligner que ces événements existaient. J'ai transféré la routine de nodeclick à l'événement afterselect et cela a fonctionné parfaitement. –

0

Puis-je clarifier? Vous voulez juste que cette logique s'applique sur un clic gauche, oui?

if (e.Button == MouseButtons.Left && e.Node != null) 
    { 
     switch(...) { 
      ... 
     } 
    } 

aussi - plutôt que des numéros d'index codage en dur, vous pourriez envisager de mettre la .Tag contre les nœuds - éviter tous les switch etc:

if (e.Button == MouseButtons.Left && e.Node != null) 
    { 
     GroupBox grp = e.Node.Tag as GroupBox; 
     if(grp != null) ShowGroupBox(grp); 
    } 

Ensuite, tout ce que vous devez faire est de définir la .Tag s en premier lieu:

someNode.Tag = groupboxZero; 
    someOtherNode.Tag = groupboxOne; 
    someThirdNode.Tag = groupboxTwo; 

(note - ce qui est juste pour cnosideration, si votre code fonctionne, et vous êtes heureux - ne changent il).

+0

J'ai utilisé beaucoup Element.Tag mais un Dictionary est moins sujette aux erreurs. –

+0

J'apprécie la réponse informative mais j'ai été obligé de donner cette réponse à Henk Holterman. Je n'étais pas au courant que beforeselect et afterselect événements étaient disponibles et simplement en transférant la routine, il a fonctionné parfaitement sans avoir à vérifier le clic de la souris ou l'ajout de tags.The tag tipis appre –

Questions connexes