VB.NET / Treeview, Nodeclick

Seemann

Admiral Special
Mitglied seit
17.04.2002
Beiträge
1.726
Renomée
43
Standort
Langenhagen
  • Spinhenge ESL
  • Docking@Home
  • BOINC Pentathlon 2012
  • BOINC Pentathlon 2013
  • BOINC Pentathlon 2014
  • BOINC Pentathlon 2015
  • BOINC Pentathlon 2016
  • BOINC Pentathlon 2017
  • BOINC Pentathlon 2018
  • BOINC Pentathlon 2019
  • BOINC Pentathlon 2020
  • BOINC Pentathlon 2021
  • BOINC Pentathlon 2022
  • BOINC Pentathlon 2023
'n Abend liebe Forumsgemeinde.

Ich hab folgendes Problem: Ich hab in VB.NET ein Treeview-Steuerelement mit ein paar Einträgen (= Nodes) auf mehreren Ebenen. Das heißt, ich kann den Baum mit dem Plus-Zeichen vor den Einträgen auf- und zuklappen.

Das ganze geklicker auf den Nodes wird in der Methode "NodeMouseClick" ausgewertet. Wie kann ich denn aber in dieser Methode feststellen, ob tatsächlich auf einen Node (also auf den Text selber) oder auf das olle Plus-Icon geklickt wurde?

Mit anderen Worten: Wie stelle ich fest, ob der Benutzer den Baum lediglich auf- oder zugeklappt hat, oder ob er einen Eintrag im Baum ausgewählt hat?
 
Gibt es für das Auswählen eines Items nicht ein eigenes Event?

Ansonsten sollte es über einen HitTest gehen. Du bekommst doch bei NodeMouseClick sicherlich die Koordinaten des Mauszeigers übergeben und es gibt doch sicherlich eine Methode HitTest oder so, welche dir sagt was an dieser Stelle ist.
 
Wie stelle ich fest, ob der Benutzer den Baum lediglich auf- oder zugeklappt hat, oder ob er einen Eintrag im Baum ausgewählt hat?

Die verwendest WinForms, oder? Dann helfen Dir evtl. Die Events AfterSelect, AfterExpand und AfterCollapse weiter.
 
Jepp, ich machs mit WinForms.

Ich hab jetzt ein anderes Event (AfterChange) genommen, das ist das was ich gebraucht habe.
 
Das ganze ist etwas komplizierter.

Es gibt die Ereignisse:
NodeClick
NodeDoubleClick
BeforeExpand
AfterExpand
BeforeCollapse
AfterCollapse

Die Events werden in folgender Reihenfolge aufgerufen (vorausgesetzt es wird kein Focus weggenommen z.B. durch eine MessageBox):

1.) Beim Klicken auf den Text:
NodeClick

2.) Beim Klicken auf das Plus:
BeforeExpand bzw. BeforeCollapse
AfterExpand bzw. AfterCollapse
NodeClick

3.) Beim Doppelklicken auf den Text:
NodeClick
BeforeExpand bzw. BeforeCollapse
AfterExpand bzw. AfterCollapse
NodeDoubleClick

Kurzfassung von dem Ganzen:
Das Ereignis Before- bzw. AfterExpand wird immer vor dem Mouse DoubleClick ausgewertet, obwohl sich mir der Sinn dessen nicht ganz erschließt.

Der Unterschied zwischen Before- und AfterExpand liegt darin, dass du beim Before andere EventArgs bekommst. Darin kannst du den Vorgang noch abbrechen, indem du Cancel auf True setzt.

So richtig eine Lösung habe ich jetzt momentan auch nicht, weil es für mich bisher immer egal war, worauf der User geklickt hat, aber vielleicht kannst du ja einen Nutzen daraus ziehen, dass das Expand immer zuerst kommt, wenn es das Plus ist.

Weiters solltest du immer die Events möglichst spezifisch handlen, also nicht Sender as Object, sondern sender as treeview und nicht e as EventArgs, sondern e as TreeViewEventArgs, TreeViewNodeClickEventArgs usw. Was der Event produziert, steht eh dabei

Frage: Was soll denn genau wass passieren:
1.) Auf Plus geklickt
2.) Auf Test geklickt
3.) Zwei mal auf Text geklickt
 
Danke für die Aufrufreiehenfolge. So ähnlich hatte ich mir das auch zusammengereimt.

Mein Problem war ja im Grunde folgendes:

Ich wollte einen bestimmten Programmteil ausführen, wenn ich auf einen Tree-Node-Eintrag klicke. Das Event was ich mir dafür auserkoren hatte war das eingangs erwähnte "NodeMouseClick" (sollte ja vom Namen her auch passen...). Dummerweise wird "NodeMouseClick" halt auch aufgerufen, wenn ich auf dieses olle [+] klicke... Das macht nur in meinem Programm überhaupt keinen Sinn.

Das lustige ist: "AfterChange" tut genau das was ich will!
 
1.) Bei mir gibt es kein AfterChange, sondern nur AfterSelect.
Irgendwie ist das eh in sich schlüssig:

Nodeklick geht einfach beim Klick los, egal ob aufs Plus mit aufmachen, zumachen Text etc.
Expanded und Collapse sind auch klar
Und AfterSelect feuert beim Markieren, also wenn der Node aus irgendeinem Grund markiert wird. Das kann beim drauf klicken passieren oder wenn ein Child selected ist und man den Parent Collapsed. Dann ist der Parent nachher selected.

2.) Du solltest nicht vergessen, dass auch Events generiert werden, wenn man eine Eigenschaft im Code direkt setzt. Da fällt man relativ leicht drüber und man landet dann auch gerne in einer Endlosschleife z.B. wenn man einen Knoten "select all" hinbaut, mit dem man alle anderen selektieren kann bzw. wenn man ein GridView hat und SelectedIndexChanged abfängt, dann wird der Event auch öfter aufgerufen manchmal bei fast jeder Zeile, die man einfügt, also Vorsicht. Das ist nicht unbedingt leicht durchschaubar, was da wann aufgerufen wird und das führt dann leicht zu Spaghetticode.
 
Ja, ist AfterSelect.


...und mit den Endlosschleifen weiß ich auch Bescheid, die sollen schließlich meine Dual-Core-CPU auslasten... *lol*


Naja, auf jeden Fall nochmal Danke für deine Hilfe!
 
Zurück
Oben Unten