vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
TreeView DragDrop Stammknoten 
Autor: Nils Christian
Datum: 08.02.18 12:31

Hallo,
ich habe ein TreeView in dem ich die Knoten hin und her verschieben kann.
Klappt ganz gut.
Wie kann ich verhindern das der Stammknoten verschoben werden kann?

Ich arbeite mit:
Windows 10 Professional 64-bit * Visual Basic 2010 Express

Beitrag wurde zuletzt am 08.02.18 um 12:33:34 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Franki
Datum: 09.02.18 03:45

Hallo,
Indem du ermittelst, ob es sich beim zu verschiebendem Knoten um den Root (Stammknoten) handelt. Falls ja brichst du den Verschiebevorgang ab bzw. du prüfst vorher und erlaubst das Verschieben erst gar nicht.

Du musst ja beim DragDrop sowieso Quelle und Ziel erfassen damit du weißt was von wo nach wo in der Struktur verschoben werden soll.

aber vielleicht wären etwas ausführlichere Informationen (Code) hilfreich.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Nils Christian
Datum: 09.02.18 09:29

Hallo Franki,
ich sende mal den Code.
Mir ist nur nicht ganz klar in welchem Teil des Codes ich überprüfen kann was der Stammordner ist.

 Private Sub Baum_DragDrop(sender As Object, e As _
   System.Windows.Forms.DragEventArgs) Handles Baum.DragDrop
        If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", True) = False _
        Then Exit Sub
        Dim gewählterBaum As TreeView = CType(sender, TreeView)
        Dim Knoten As TreeNode = CType(e.Data.GetData( _
          "System.Windows.Forms.TreeNode"), TreeNode)
        Dim Zielknoten As TreeNode = gewählterBaum.SelectedNode
 
        'Nur wenn der Zielknoten ein Zettelkasten oder der Stammordner ist kann 
        ' verschoben werden
        If Zielknoten.Tag = "Zettelkasten" Or Zielknoten.Tag = "Stammordner" _
          Then
            Knoten.Remove()
            If Zielknoten Is Nothing Then
                gewählterBaum.Nodes.Add(Knoten)
            Else
                Zielknoten.Nodes.Add(Knoten)
            End If
            Knoten.EnsureVisible()
            gewählterBaum.SelectedNode = Knoten
        End If
 
    End Sub
    Private Sub Baum_DragEnter(sender As Object, e As _
      System.Windows.Forms.DragEventArgs) Handles Baum.DragEnter
        ' Sehen, ob ein TreeNode gezogen wird
        If e.Data.GetDataPresent(" System.Windows.Forms.TreeNode", True) Then
            ' TreeNode gefunden erlaubt Bewegungseffekt
            e.Effect = DragDropEffects.Move
        Else
            ' Kein TreeNode gefunden, Bewegung verhindern
            e.Effect = DragDropEffects.None
        End If
    End Sub
    Private Sub Baum_DragOver(sender As Object, e As _
      System.Windows.Forms.DragEventArgs) Handles Baum.DragOver
 
        'Wenn kein Knoten gezogen wird, dann raus aus der Sub
        If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", True) = False _
          Then Exit Sub
        Dim pt As Point = CType(sender, TreeView).PointToClient(New Point(e.X, _
        e.Y))
        Dim Zielknoten As TreeNode = Baum.GetNodeAt(pt)
 
        If Zielknoten.Tag = "Zettelkasten" Or Zielknoten.Tag = "Stammordner" _
          Then
            If Not (Baum.SelectedNode Is Zielknoten) Then
                Baum.SelectedNode = Zielknoten
                Dim Knoten As TreeNode = CType(e.Data.GetData( _
                  "System.Windows.Forms.TreeNode"), TreeNode)
                Do Until Zielknoten Is Nothing
                    If Zielknoten Is Knoten Then
                        e.Effect = DragDropEffects.None
                        Exit Sub
                    End If
                    Zielknoten = Zielknoten.Parent
                Loop
            End If
 
            'Currently selected node is a suitable target
            e.Effect = DragDropEffects.Move
        End If
 
    End Sub
    Private Sub Baum_ItemDrag(sender As Object, e As _
      System.Windows.Forms.ItemDragEventArgs) Handles Baum.ItemDrag
        If Baum.SelectedNode.Tag = "Stammordner" Then
            Exit Sub
        End If
        DoDragDrop(e.Item, DragDropEffects.Move)
    End Sub

Ich arbeite mit:
Windows 10 Professional 64-bit * Visual Basic 2010 Express

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Franki
Datum: 10.02.18 03:18

Hallo,

du arbeitest mit Tags für die Zielknoten. Soweit so gut, hast auch "Stammordner" in der If Abfrage.

Wo liegt denn jetzt genau der Fehler? Wenn du so arbeitest kannst du doch konsequent jedem Knoten einen Tag verpassen und darauf prüfen.

Wenn deine Abfrage da nicht greift kann es evtl. sein, dass der entsprechende Knoten keinen Tag hat.

Bei deiner IF..Then hast du auch kein Else. Darüber könntest du auch auf Fehlersuche gehen indem zu z.B. für jeden Zielknoten einfach mal die Eigenschaften .tag anzeigst. Dann siehst du schnell wo das Problem liegt.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Nils Christian
Datum: 14.02.18 14:28

Hallo,
jetzt habe ich mehrere Tage rumprobiert: ohne Ergebnis

Wenn ich den "Stammordner" anklicke und dann ziehen will, klappt das nicht. So soll es ja auch sein.
Wenn ich jedoch einen anderen Knoten angeklickt habe, und dann den Stammordner ziehen will gibts ne Fehlermeldung.

Wenn ich den SelectedNode.Tag auswerten will, muss er ja ausgewählt (angeklickt) sein.

Ich arbeite mit:
Windows 10 Professional 64-bit * Visual Basic 2010 Express

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Franki
Datum: 15.02.18 01:12

Hallo,

Zitat:


Wenn ich den "Stammordner" anklicke und dann ziehen
will, klappt das nicht. So soll es ja auch sein.
Wenn ich jedoch einen anderen Knoten angeklickt habe, und
dann den Stammordner ziehen will gibts ne Fehlermeldung.


Und wie lautet die, bzw. woher kommt die?
Nimm mal als Beispiel den Windwos Explorer, ist ja auch ein TreeView sozusagen. Wenn du da versuchst eine Stammordner (z.B. Bilder) in einen Unterordner (z.B. Urlaub) zu verschieben kommt auch eine Fehlermeldung, dass das nicht geht.

Zitat:


Wenn ich den SelectedNode.Tag auswerten will, muss er ja
ausgewählt (angeklickt) sein.


Richtig, aber indem du den zu verschiebenden Ordner überhaupt "anfasst" mit der Maus sollte er automatisch ausgewählt sein, denn einen nicht ausgewählten Ordner kann ein User ja nicht verschieben. Und damit sollte der SelectedNode genau dein Ordner sein. Prüfe doch einfach vor dem Verschiebevorgang welcher Node grade .selected ist.

Gruß
Frank
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Nils Christian
Datum: 15.02.18 13:03

Hallo,
das Problem ist das der Ordner wenn er "angefasst" wird nicht automatisch ausgewählt wird, das heißt der Ordner, der vorher angeklickt wurde ist immer noch Selected.
Ich habs auch mit MouseDown, MouseClick, NodeMouseClick ausprobiert. Das "Anfassen" wird nirgendwo bemerkt, nur bei ItemDrag aber da ist dann der Ordner nicht selected.
Gruß
Nils

Ich arbeite mit:
Windows 10 Professional 64-bit * Visual Basic 2010 Express

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Nils Christian
Datum: 15.02.18 13:43

Ich habe jetzt eine Lösung gefunden.
Es ist aber eine "dreckige" Lösung: Ich kontrolliere die Position des Mauszeigers uber dem TreeView. Dadurch weiß ich wann sich der Mauszeiger über dem Stammordner befindet, und breche dann den Ziehvorgang ab.

Ich arbeite mit:
Windows 10 Professional 64-bit * Visual Basic 2010 Express

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: TreeView DragDrop Stammknoten 
Autor: Nils Christian
Datum: 26.02.18 21:39

Jetzt habe ich eine Lösung gefunden, die nicht dreckig ist:

    Private Sub Baum_ItemDrag(sender As Object, e As _
      System.Windows.Forms.ItemDragEventArgs) Handles TreeView1.ItemDrag
        'Verschieben bei gedrückter linker Maustaste
        If e.Button = MouseButtons.Left Then
            DoDragDrop(e.Item, DragDropEffects.Move)
            'Kopieren bei gedrückter rechter Maustaste
        ElseIf e.Button = MouseButtons.Right Then
            DoDragDrop(e.Item, DragDropEffects.Copy)
        End If
    End Sub
 
    Private Sub Baum_DragEnter(sender As Object, e As _
      System.Windows.Forms.DragEventArgs) Handles TreeView1.DragEnter
        e.Effect = e.AllowedEffect
    End Sub
 
    Private Sub Baum_DragOver(sender As Object, e As _
      System.Windows.Forms.DragEventArgs) Handles TreeView1.DragOver
 
        'Zielpunkt wird berechnet
        Dim Zielpunkt As Point = TreeView1.PointToClient(New Point(e.X, e.Y))
 
        'Zielpunkt wird selektiert
        TreeView1.SelectedNode = TreeView1.GetNodeAt(Zielpunkt)
 
 
    End Sub
 
    Private Sub Baum_DragDrop(sender As Object, e As _
      System.Windows.Forms.DragEventArgs) Handles TreeView1.DragDrop
 
        'Zielpunkt wird berechnet
        Dim Zielpunkt As Point = TreeView1.PointToClient(New Point(e.X, e.Y))
 
        'Der Zielknoten wird anhand des Zielpunktes bestimmt
        Dim Zielknoten As TreeNode = TreeView1.GetNodeAt(Zielpunkt)
 
        'Damit wird das ziehen in die Leere verhindert
        If Zielknoten Is Nothing Then Exit Sub
 
        'Nur das ziehen zulassen wenn es in keinem Zettel eingefügt werden soll
        If Zielknoten.Tag = "Zettelkasten" Or Zielknoten.Tag = "Stammordner" _
          Then
 
            'Der Gezogene Knoten
            Dim GezogenerKnoten As TreeNode = CType(e.Data.GetData(GetType( _
              TreeNode)), TreeNode)
 
            'Es wird verhindert das der gezognene Knoten nicht der Elternknoten 
            ' ist
            If Not GezogenerKnoten.Equals(Zielknoten) AndAlso Not _
              Elternknoten_Suche(GezogenerKnoten, Zielknoten) Then
 
                If e.Effect = DragDropEffects.Move Then
                    'Wenn Knoten ausgeschnitten wird, wird er gelöscht ...
                    GezogenerKnoten.Remove()
 
                    '... und wieder eingefügt ...
                    Zielknoten.Nodes.Add(GezogenerKnoten)
 
                    '... oder wird nur kopiert ...
                ElseIf e.Effect = DragDropEffects.Copy Then
                    '... und dann eingefügt
                    Zielknoten.Nodes.Add(CType(GezogenerKnoten.Clone(), _
                      TreeNode))
                End If
                'Zielknoten wird expandiert
                Zielknoten.Expand()
 
            End If
 
        End If
 
    End Sub
 
    Private Function Elternknoten_Suche(ByVal Knoten1 As TreeNode, ByVal _
      Knoten2 As TreeNode) As Boolean
 
        'Ermittelt den Elternknoten der 2.Knotens
        If Knoten2.Parent Is Nothing Then
            Return False
        End If
        If Knoten2.Parent.Equals(Knoten1) Then
            Return True
        End If
 
        Return Elternknoten_Suche(Knoten1, Knoten2.Parent)
 
    End Function

Ich arbeite mit:
Windows 10 Professional 64-bit * Visual Basic 2010 Express

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel