none
Treeview ContextMenuStripeItem TreeNode Tag [VS 2010 professional VB WindowsForms ] RRS feed

  • 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

    Freitag, 22. Oktober 2010 17:26

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
    Sonntag, 24. Oktober 2010 20:12
    Moderator

Alle Antworten

  • Hallo Rolf,

    TreeView.SelectedNode.Tag sollte die gewünschte Info liefern.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    vb-faq.de
    Freitag, 22. Oktober 2010 17:32
    Moderator
  • 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

    Samstag, 23. Oktober 2010 16:43
  • 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
    Sonntag, 24. Oktober 2010 13:42
    Moderator
  • 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

     

    Sonntag, 24. Oktober 2010 19:47
  • 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
    Sonntag, 24. Oktober 2010 20:12
    Moderator
  • 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

     

    Sonntag, 24. Oktober 2010 20:36