| |
VB.NET - Ein- und UmsteigerTreeView 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. | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|