I normalfallet så fungerar koden nedan för att fånga upp "draggedNode" men om man inte vet subtypen på noden så fungerar det inte. Det är ingen snygg lösning men den funkar. Eftersom jag flyttar noder i trädet så finns ju den subtypade typen av objekt i trädet så jag gräver mig rekursivt genom trädet tills jag hittar rätt. Ett bättre förslag på kod...Subtyp av object vid DragDrop
Altså hur tar man reda på subtypen på ett objekt när man fångar upp det med "drgevent.Data.GetData"?
Alternativt så behöver jag inte veta subtypen utan det räcker att få reda på hur jag castar objectet till sin supertyp om jag nu lyckas fånga upp det.
<code>
Public Class myTreeView
Inherits System.Windows.Forms.TreeView
...
Protected Overrides Sub OnDragDrop(ByVal drgevent As System.Windows.Forms.DragEventArgs)
' Retrieve the node that was dragged.
Dim draggedNode As TreeNode = CType(drgevent.Data.GetData(GetType(TreeNode)), TreeNode)
...
</code>
Problem uppstår då subtyper av noder inte är känd från början av myTreeView exempelvis om noden nedan läggs till i trädet.
<code>
Public Class myTreeNode
Inherits System.windows.forms.TreeNode
public myString as string
end Class
</code>
/BennySv: Subtyp av object vid DragDrop
Om någon har ett bättre förslag så får ni gärna posta en kodsnutt.
<code>
...
' Ta hand om specialfall
If draggedNode Is Nothing Then
draggedNode = findIT(Me.Nodes, drgevent)
End If
...
end sub
Private Function findIT(ByVal aNode As TreeNodeCollection, ByVal drgevent As System.windows.Forms.DragEventArgs) As TreeNode
Dim aObj As Object
Dim aTreeNode As TreeNode
For Each aObj In aNode
aTreeNode = CType(drgevent.Data.GetData(aObj.GetType), TreeNode)
If Not aTreeNode Is Nothing Then
Return CType(aTreeNode, TreeNode)
End If
findIT(CType(aObj, TreeNode).Nodes, drgevent)
Next
End Function
</code>
Något buggig kod :(Sv: Subtyp av object vid DragDrop
<code>
Private Function findIT(ByVal aNode As TreeNodeCollection, ByVal drgevent As System.windows.Forms.DragEventArgs) As TreeNode
nodFindIt = Nothing
findIT2(aNode, drgevent)
Return nodFindIt
End Function
Dim nodFindIt As TreeNode
Private Sub findIT2(ByVal aNode As TreeNodeCollection, ByVal drgevent As System.windows.Forms.DragEventArgs)
Dim aObj As Object
For Each aObj In aNode
If nodFindIt Is Nothing Then
nodFindIt = CType(drgevent.Data.GetData(aObj.GetType), TreeNode)
End If
If Not nodFindIt Is Nothing Then
Exit Sub
End If
findIT2(CType(aObj, TreeNode).Nodes, drgevent)
Next
End Sub
</code>