PDA

Vollständige Version anzeigen : Treenode einfügen, DragDrop


murer
10.09.2006, 21:47
Hallo

Mein Formular enthält Menubuttons, Contextmenus und einen Treeview. Eine Klasse fügt Objekte als Treenodes in den Treview "trvItem" ein. Wenn ich diese Klasse verwende aus dem Menubutton, dann funktioniert dies tadellos. Wenn ich das gleiche aus dem Contextmenu aufrufe (rechte Maustaste auf einem selektierten Knoten), dann rauscht die ganze Sache in einen Endlos-Loop rein. Ein Debug-Break zeigt mir immer eine EndIf-Position in der Klasse trvItem_DragDrop. Mit F11-Einzelschritt läuft das Programm weiterhin in einer Endlosschlaufe ohne dabei die Programmposition anzuzeigen. Bin überzeugt, dass die DragDrop-Sache da reinspielt, da ein auskommentieren von DragDrop das Problem behebt. Die DragDrop-Funktion erlaubt mir das Verschieben einzelner Treenodes und funktioniert eigentlich und ich würde diese Funktion gerne behalten. Aber wie beides zusammen??

Wer hat mir da eine Idee wonach ich suchen soll.

Gruss und Dank
murer

Folgender Code-Auszüge habe ich verwendet


'Code aktiviert als Menubutton oder ContextMenu

Case e.Button Is Me.ToolBarButton6

Dim tnSel As TreeNode
tnSel = Me.trvItem.SelectedNode

' Wenn das selektierte Objekt ein Ordner ist, dann dürfen die kopierten Items eingefügt werden
If tnSel.ImageIndex = NodeTypes.Ordner Then
Call clsTree.insertItem(tnSel)
Else
MsgBox("Bitte einen Ordner selektieren um die kopierten Teile einzufügen")
End If



Private Sub trvItem_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles trvItem.DragEnter

'2. Schritt : schauen ob ein Knoten selektiert wurde zum Schieben, ansonsten wird das Schiebe-Icon wieder entfernt von der Maus

If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", True) Then
e.Effect = DragDropEffects.Move
Else
e.Effect = DragDropEffects.None
End If

End Sub



Private Sub trvItem_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles trvItem.DragDrop



Dim nodeMoveOk As Integer = 0

'4. Schritt : Der Quell-Knoten wird verschoben, falls ein Ziel-Knoten selektiert wurde

If e.Data.GetDataPresent("System.Windows.Forms.TreeNode", True) = False Then Exit Sub

Dim selectedTreeview As TreeView = CType(sender, TreeView)
Dim dropNode As TreeNode = CType(e.Data.GetData("System.Windows.Forms.TreeNode"), TreeNode)

Dim dropNodeType As Integer = dropNode.ImageIndex
Dim targetNode As TreeNode = selectedTreeview.SelectedNode
Dim targetNodeType As Integer = targetNode.ImageIndex

' *** Prüfen ob der Node verschoben werden darf

'Ordner nach Root darf verschoben werden
If dropNodeType = 1 And targetNodeType = 0 Then
nodeMoveOk = 1
End If

'Ordner nach Ordner darf verschoben werden
If dropNodeType = 1 And targetNodeType = 1 Then
nodeMoveOk = 1
End If

'Item zu Ordner darf verschoben werden
If dropNodeType = 3 And targetNodeType = 1 Then
nodeMoveOk = 1
End If

If dropNodeType = 2 And targetNodeType = 1 Then
nodeMoveOk = 1
End If

If nodeMoveOk = 1 Then

dropNode.Remove()

If targetNode Is Nothing Then
selectedTreeview.Nodes.Add(dropNode)
Else
targetNode.Nodes.Add(dropNode)
End If

dropNode.EnsureVisible()
selectedTreeview.SelectedNode = dropNode


End If

End Sub

:(

murer
15.09.2006, 10:23
Hallo

Hab das Problem nun selbst gelöst. Die rechte Maustaste auf einem TreeNode aktiviert leider auch das DragDrop-Event. Meine Überlegung dazu ist: wenn die rechte Maustaste auf einem TreeNode gedrückt wird, dann möchte man ein Context-Menu aufrufen. Mit der Überprüfung ob der ursprünglich selektierte Node (vor dem DragDrop-Event) identisch ist mit dem Target-Node (nach dem DragDrop-Event) kann man gezielt aus dem DragDrop-Event aussteigen.

Beispiel:

'wenn der TargetNode der gleiche ist wie der SelectedNode, dann wird kein DragDrop gewünscht,
' Leider kommt das DrgDrop-Event auch, wenn man mit der rechten Maustaste ein Context-Menu aufruft. Dies
' ist aber an der Stelle nicht erwünscht.
'
If dropNode.Text = targetNode.Text Then
Exit Sub
End If