Events überschneiden sich bei TreeView

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Bernd.

    Events überschneiden sich bei TreeView

    Hallo zusammen,

    ich bastel gerade an einer TreeView.
    Im AfterSelect habe ich eine kleine Funktion die mir die DateiInfos ausliest.
    Im MouseDown habe ich die Drag&Drop Funktion.
    Im DoubleClick habe ich eine Funktion die den nächsten Folder einliest.

    MouseDown und DoubleClick überschneiden sich. Logisch

    Welche Möglichkeiten gibt es denn noch ? Hat einer ne Idee ?

    Ich habe auch MouseEnter, MouseDoubleClick, NodeMouseDoubleClick.... usw. durch.
    Das blöde währe wenn ich den DoubleClick durch ein ContextMenu ersetzen müsste.

    Vielen dank
    Bernd
    ich sehe keine Möglichkeit, Afterselect funktional von DoubleClick zu trennen.
    Also wenn DoubleClick auftritt, ist AfterSelect immer bereits aufgetreten.

    Sonst müsstest du ja eine Verzögerung einbauen, die erstmal wartet, ob nicht noch der 2. MousDown des DoubleClick kommt oder nicht.

    Was ist das für eine Einleserei von DateiInfos?

    Ich hatte mal ein FolderTreeview gebastelt, der hat DateiInfos im NebenThread eingelesen, sodaß sie im AfterSelect bereits parat waren.

    ErfinderDesRades schrieb:

    Was ist das für eine Einleserei von DateiInfos?

    Die Infos werden beim einlesen (Threading) in das TAG geschrieben.
    Wenn sich nun das TreeNode ändert, wird der Titel der GroupBox mit dem ausgewähltem Item bestückt.
    Sieht Cool aus, vorallem mit dem verkürzten Pfad.


    OK ich habe verstanden,

    entweder viel Aufwand oder kurz und knackig ein ContextMenu.

    Danke euch wie immer

    Bernd


    Ups

    jetzt Überschneiden sich folgenden beiden Events

    MouseDown (bei Drag&Drop)
    ContextMenue_RF_Links.Click

    und nu ?


    danke

    Bernd

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bernd“ ()

    Genau das habe ich mir auch gedacht ! mhhh
    Scheinbar kommen die sich in die quere.

    Ich habe als Test alle anderen Events aus der Form auskommentiert und nur diese beiden gelassen.

    Die mögen sich nicht !

    Wat mach ich den nu ?
    Das ist doch gang und gebe mit MouseDown bei Drag&Drop.

    Bernd

    Bernd schrieb:

    Wat mach ich den nu ?

    Ich gebe zu ich verstehe Dein Problem noch nicht so ganz: es ist doch ganz normal , dass man bei MouseClick oder NodeMouseClick Events überprüft welcher MouseButton gedrückt wurde und ob Modifier-Tasten wie Ctrl, Alt, Shift dabei gedrückt wurden. Das wird ja alles in den EventArgs mitgegeben, wie Du auch weisst.

    Das gilt für DragDrop genauso wie für das Contextmenu.

    Sry, steh da gerade auf dem Schlauch. Vielleicht kannst Du ja mal ein Beispiel geben was Du möchtest .... oder wir warten auf nen Schlaueren ;)
    Nachdem ich alle Events aus der Form auskommentiert habe, die das TreeView betreffen, bleiben noch zwei Event übrig.

    1 Event MouseDown für den Drag&Drop ein zu leiten.

    VB.NET-Quellcode

    1. Me.TV_Links.AllowDrop = True
    2. AddHandler Me.TV_Links.MouseDown, AddressOf TreeViewMouseDown

    1 Event CoMe_Read_Folder_Links.Click -< CoMe steht für ContextMenu

    VB.NET-Quellcode

    1. Private Sub CoMe_ReadFolder_Links_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    2. Handles CoMe_ReadFolder_Links.Click
    3. ' Nur bei Folder
    4. If TV_Links.SelectedNode.Tag.ToString.StartsWith("Folder") Then
    5. ' Auftrag Starten
    6. With Einlesen_Linke_Site
    7. .Start_Einlesen_Left_Site(Auftrag_Einlesen._Root_Or_Node.Node)
    8. End With
    9. End If
    10. End Sub


    Klicke ich nun auf ein TreeNode und dann klicke ich mit der rechten Maustaste, geschieht nichts.
    Erst beim zweiten, manchmal beim dritten Rechtsklick erscheint das ContextMenu.

    Gegenprobe:
    alle Event wieder eingebaut und nur das MouseDown bei Drag&Drop auskommentiert,
    dann geht es.

    So das müsste jetzt aber verständlich sein, Hoffe ich.


    danke

    Bernd
    D&D triggert man auch bischen anders:

    Man merkt sich den MouseDown, dragt aber noch nicht los, sondern horcht erstma auf MouseMove. Wenn die Maus mit gehaltener Maustaste ein bestimmtes Stück gezogen wurde - erst dann ruft man Control.DoDragDrop()

    Ah - bei Treeview kannste auch mal das ItemDrag-Event ausprobieren

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    D&D triggert man auch bischen anders:

    stimmt

    ErfinderDesRades schrieb:

    an merkt sich den MouseDown, dragt aber noch nicht los, sondern horcht erstma auf MouseMove. Wenn die Maus mit gehaltener Maustaste ein bestimmtes Stück gezogen wurde - erst dann ruft man Control.DoDragDrop()

    *hust* wie wäre es mit dem ItemDrag Event ?

    Bernd, ich hab mal
    - ein Treeview auf eine Form gezogen
    - ein Contextmenu aus der Toolbox
    - dies im Treeview eingetragen

    Folgende Ereignisse klappen alle wunderbar:

    MouseClick Events

    VB.NET-Quellcode

    1. Public Class Form1
    2. ' form load
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. TreeView1.Nodes.AddRange({New TreeNode("rot"), New TreeNode("gelb"), New TreeNode("grün")})
    5. End Sub
    6. ' treeview item drag
    7. Private Sub TreeView1_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles TreeView1.ItemDrag
    8. Debug.Print("start item drag")
    9. End Sub
    10. ' treeview mouse down
    11. Private Sub TreeView1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseDown
    12. Debug.Print("ich bin ein Treeview Mousedown")
    13. End Sub
    14. ' node mouse click
    15. Private Sub TreeView1_NodeMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
    16. Debug.Print("ich bin ein Node Mouseclick")
    17. End Sub
    18. ' contextmenu item clik
    19. Private Sub ContextMenuStrip1_ItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ContextMenuStrip1.ItemClicked
    20. Debug.Print("ich bin ein Click im ContextMenu")
    21. End Sub
    22. End Class


    So ich habe weiteres raus gefunden,

    erstmal danke an euch beide.

    Beim Explorer kann man gleich mit der rechten Maustaste auf ein Node Klicken. Das Node wird markiert und das ContextMenu Pop auf.
    Bei einer TreeView (Testprojekt, nicht mein Projekt) zeigt sich ein anderes verhalten.
    Beim klick auf ein Node wird es selectiert. Bewege ich die Maus etwas nach links, rechts rauf oder runter, kommt das ContextMenu. Halte ich Exakt die geliche Position, also erst selectieren und dann gleich der rechtsklick, passiert nichts.
    Klicke ich direkt mit rechtsklick auf ein Node, kommt das Contextmenu sofort. Jedoch wird das neu gewählte Iem dann nicht mehr selectiert.

    Gut das bedeutet die TreeView in VB reagiert anders. Zudem muss ich noch etwas einbauen damit beim direkten rechtsklick das Node auch gleich selectiert wird.

    Ich hatte alles störfaktoren ausgeblendet und dann alle Events die Kangaroo genannt hat ausprobiert. und noch einige mehr.

    Das Verhalten ändert sich aber nicht.

    OK ich Arbeite mal weiter an diesem ungewollten verhalten. Mal sehen was ich da noch dran ändern kann.


    Vielen dank euch beiden

    Bernd
    ich hab noch eine Frage zur "Überschneidung" von AfterSelect und Doppelklick:
    Issn das ühaupt schlimm?
    Ich fände das logisch, wenn man auf einen unselektierten Node doppelklickst, dass das normale AfterSelect-Verhalten auftritt, und zusätzlich halt die Doppelklick-Wirkung.
    So habe jetzt eine Lösung gefunden bei der alle Events die ich benötige auch funktionieren.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub TV_Links_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) _
    2. Handles TV_Links.AfterSelect
    3. ' Der GroupBox den verkürzten Namen geben. Der Original Pfad und Name bleibt im GB TAG
    4. Make_Short_Path(TV_Links, GB_TV_Links)
    5. End Sub
    6. Private Sub TV_Links_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
    7. Handles TV_Links.MouseDown
    8. If e.Button = Windows.Forms.MouseButtons.Right Then
    9. Dim TV As TreeView = DirectCast(sender, TreeView)
    10. Dim node As TreeNode = TV.GetNodeAt(e.X, e.Y)
    11. TV.SelectedNode = node
    12. End If
    13. End Sub
    14. Private Sub TV_Links_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) _
    15. Handles TV_Links.DoubleClick
    16. ' Nur bei Folder
    17. If TV_Links.SelectedNode.Tag.ToString.StartsWith("Folder") Then
    18. ' Auftrag Starten
    19. With Einlesen_Linke_Site
    20. .Start_Einlesen_Left_Site(Auftrag_Einlesen._Root_Or_Node.Node)
    21. End With
    22. End If
    23. End Sub
    24. Private Sub CoMe_ReadFolder_Links_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    25. Handles CoMe_ReadFolder_Links.Click
    26. ' Nur bei Folder
    27. If TV_Links.SelectedNode.Tag.ToString.StartsWith("Folder") Then
    28. ' Auftrag Starten
    29. With Einlesen_Linke_Site
    30. .Start_Einlesen_Left_Site(Auftrag_Einlesen._Root_Or_Node.Node)
    31. End With
    32. End If
    33. End Sub
    34. Private Sub TV_Links_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) _
    35. Handles TV_Links.ItemDrag
    36. TV_Links.DoDragDrop(e.Item, DragDropEffects.Copy)
    37. End Sub


    @Kangaroo
    Die Lösung lag im Handles TV_Links.ItemDrag, welches ich übersehen habe.
    Damit klappt dat jot.

    danke nochmals

    Bernd