2009-04-05 3 views
1

Ich habe einen Code erstellt, der eine entsprechende Groupbox anzeigt, die dem Baumansichtsknoten entspricht, der wie ein Menümenü "Einstellungen" angeklickt wird. Der Code tut, was er tun soll, aber mein Problem ist herauszufinden, wie es gemacht wird, so dass eine andere Groupbox nicht in Sicht genommen wird, wenn ein anderer Gegenstand in der Baumansicht mit der rechten Maustaste angeklickt wird.C#: Hilfe beim Iterieren durch Treeview-Elemente durch das NodeMouseClick-Ereignis

[Ausführliche]

der dort Lassen Sie sagen, sind drei Knoten in der Baumansicht. 0) Allgemein; 1) Geräusche; und 2) Über; Wenn ich auf Knoten [1] Sounds klicke, wird das entsprechende Groupbox angezeigt, aber wenn ich mit der rechten Maustaste auf den TreeView-Knoten [0] Allgemein klicke, wird der Rahmen angezeigt und sobald ich den rechten Mausklick anhebe, wird der Fokus zurückgesetzt Zurück zu [1] Sounds, aber lass die Groupbox für den Knoten 0) General. Wie konnte ich das ausfallsicher machen?

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

Antwort

0

Die beste Antwort könnte nicht sein, treeView1_NodeMouseClick überhaupt zu verwenden, sondern mit dem Standard treeView1_AfterSelect zu bleiben.

Sie haben auch einen BeforeSelect, der nützlich sein könnte, um Daten zu speichern oder abzubrechen.

+0

Vielen Dank für den Hinweis, dass diese Ereignisse existierten. Ich habe die Routine von nodeclick auf das afterselect-Ereignis übertragen und es funktionierte einwandfrei. –

0

Kann ich klären? Sie wollen nur, dass diese Logik bei einem Linksklick angewendet wird, ja?

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

auch - eher als hart codierte Indexzahlen, könnten Sie betrachten die .Tag gegen den Knoten Einstellung - vermeiden alle switch etc:

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

Dann alles, was Sie tun müssen, um eingestellt ist, die .Tag s in erster Linie:

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

(Anmerkung - das ist nur für cnosideration, wenn Ihr Code funktioniert, und Sie sind glücklich - nicht ändern es).

+0

Ich habe Element.Tag viel benutzt, aber ein Dictionary ist weniger fehleranfällig. –

+0

Ich schätze die informative Antwort, aber ich war gezwungen, Henk Holterman diese Antwort zu geben. Ich war mir nicht bewusst, dass vorselektiert und nachselect Ereignisse zur Verfügung standen und einfach durch die Übertragung der Routine funktionierte es einwandfrei, ohne auf Mausklick oder Hinzufügen von Tags zu überprüfen. Das Tag tippis appre –