Benutzer mit den meisten Antworten
Treeview ContextMenuStripeItem TreeNode Tag [VS 2010 professional VB WindowsForms ]

Frage
-
Hallo zusammen,
mit Hilfe des Formus habe ich nun erfolgreich ein TreeView generiert und auch mit ContextStripeItems versehen. VIELEN DANK fuer eure Geduld !
So weit so gut.Wie komme ich im Eventhandler fuer den click auf ein ContextItem and das Tag des TreeNodes ?
Im container koennte ja eine ganze Hierarchie sein und ich weiss ueberhaupt nicht auf welchen Level ich bin.
Jedenfalls steht die row ID einer Tabelle auf die ich zugreifen muss im Tag des TreeNodes.Ein Beispiel waere schoen.
Gruss
Rolf
- Verschoben Thorsten DörflerModerator Freitag, 22. Oktober 2010 17:33 lt. Topic VS Pro (aus:Visual Basic .NET Express-Edition)
Antworten
-
Hallo Rolf,
sehe jetzt, dass sich der rechte Mausklick beim TreeNode etwas anders als erwartet verhält und hier zwar der Node hervorgehoben wird, aber nicht als selektierter Node abfragbar ist.
Workaround: Aktuellen Node via HitTest ermitteln und im Tag des ContextMenuStrip zwischenspeichern:
Private Sub ContextMenuStrip1_Opening(ByVal sender As System.Object, _ ByVal e As System.ComponentModel.CancelEventArgs _ ) Handles ContextMenuStrip1.Opening ContextMenuStrip1.Tag = TreeView1.HitTest(TreeView1.PointToClient(Control.MousePosition)).Node End Sub Private Sub ContextMenuStrip1_ItemClicked(ByVal sender As Object, _ ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs _ ) Handles ContextMenuStrip1.ItemClicked If TypeOf ContextMenuStrip1.Tag Is TreeNode Then Debug.Print("Node: {0}", DirectCast(ContextMenuStrip1.Tag, TreeNode).Text) End If End Sub
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort markiert Rolf Kemper Sonntag, 24. Oktober 2010 20:23
Alle Antworten
-
Hallo Thorsten,
ich habe an dem Node ein Kontextmenu. Wenn ich den Node nicht explezit vorher anclicke bekomme ich nichts zurueck.
Der Node muss also offensicht wirklich selektiert sein damit ich mit SeledNode.Tag den Inhalt des Tags bekomme.
Was nun ?
Rolf
-
Hallo Rolf,
ich habe an dem Node ein Kontextmenu. Wenn ich den Node nicht explezit vorher anclicke bekomme ich nichts zurueck.
wie hast Du das Kontextmenü an den Knoten gebunden? Wie zeigst Du es an?
Der Node muss also offensicht wirklich selektiert sein
Natürlich. Das passiert für gewöhnlich automatisch. Es kommt aber auf den korrekten Aufruf des Kontextmenüs an.
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de -
Hallo Thorsten,
vermutlich ist meine Vorgehensweise doch zu primitiv. Ich habe den Tree mit geschachtelten for each aufgebaut da jeder Level aus einem ander Object (Tabelle auf dem SQL SERVER ) kommt. Hier ein Level mit der Anbindung des menus.
Dim burstRows = Me.PatGenDataSet.PatGenBursts_tab.Select("FPGAStreams_ID = " & configNode.Tag) For Each burstRow As DataRow In burstRows node = New TreeNode(CStr(burstRow("Name"))) node.Tag = CInt(burstRow("FPGAStreams_ID")) node.ContextMenuStrip = Me.cmsMPGPatternBurst Dim burstNode As TreeNode = configNode.Nodes(configNode.Nodes.Add(node)) Next
Den MenuStripe habe ich erst mit der graphischen Oberflaeche generiert und dann einfach so zugewiesen. In dem .Select steht simple die ID der uebergeorneten Tabelle deren ID ich im Tag des parent nodes habe.
Ueber die Anzeige habe ich mir keine Gedanken gemacht (rechter mouse click tut's perfekt)Gruss
Rolf
-
Hallo Rolf,
sehe jetzt, dass sich der rechte Mausklick beim TreeNode etwas anders als erwartet verhält und hier zwar der Node hervorgehoben wird, aber nicht als selektierter Node abfragbar ist.
Workaround: Aktuellen Node via HitTest ermitteln und im Tag des ContextMenuStrip zwischenspeichern:
Private Sub ContextMenuStrip1_Opening(ByVal sender As System.Object, _ ByVal e As System.ComponentModel.CancelEventArgs _ ) Handles ContextMenuStrip1.Opening ContextMenuStrip1.Tag = TreeView1.HitTest(TreeView1.PointToClient(Control.MousePosition)).Node End Sub Private Sub ContextMenuStrip1_ItemClicked(ByVal sender As Object, _ ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs _ ) Handles ContextMenuStrip1.ItemClicked If TypeOf ContextMenuStrip1.Tag Is TreeNode Then Debug.Print("Node: {0}", DirectCast(ContextMenuStrip1.Tag, TreeNode).Text) End If End Sub
Thorsten Dörfler
Microsoft MVP Visual Basic
vb-faq.de- Als Antwort markiert Rolf Kemper Sonntag, 24. Oktober 2010 20:23
-
Hallo Thorsten,
ich denke der rework macht doppelt Sinn (Falls ich das richtig verstanden habe )
1) Ich wollte den Status des nodes auch nicht aendern, da ich einen anderen slektierten node vermutlich noch brauche.
Man denke als Beispiel nur daran : Selktier node , gehe mit der Maus auf einen ganz anderen node , context -> CopyToHere -> click. In dem Fall wuerde es storen wenn mit dem oeffnen des KontextMenus der Status des nodes wechselt.2) Wenn ich das richtig verstehe kann ich so mit der HitTest Methode Zugriff den Node und das Tag bekommen.
Damit kann man sicher auch noch sowas wie einen dynamischen mouse cursor in Abhaengigkeit vom node erstellen.Ich werde den rework ausprobieren, aber fuer heute ist die Luft bei mir raus.
Vielen Dank
Rolf