TreeView控件节点拖动,问题出在哪儿?TreeView及TreeNode均为自己继承下来的。

wzuomin 2006-12-05 06:13:30
源程序如下:

Public Class FormTest

Dim TestTreeView As MyTreeView

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
TestTreeView = New MyTreeView
TestTreeView.Visible = True
TestTreeView.Location = New Point(0, 0)
TestTreeView.Size = New Size(500, 1000)

Dim ParentNode1 As New MyTreeNode("Computer1", "192.168.1.10")
ParentNode1.Nodes.Add(New MyTreeNode("Test", "11.0.0.10"))
Dim ParentNode2 As New MyTreeNode("Computer2", "192.168.1.20")
Dim ParentNode3 As New MyTreeNode("Computer3", "192.168.1.30")
Dim ParentNode4 As New MyTreeNode("Computer4", "192.168.1.40")
Dim ParentNode5 As New MyTreeNode("Computer5", "192.168.1.50")

TestTreeView.Nodes.AddRange(New MyTreeNode() {ParentNode1, ParentNode2, ParentNode3})
TestTreeView.ExpandAll()

Me.Controls.Add(TestTreeView)

End Sub

End Class

Public Class MyTreeView
Inherits TreeView

Sub New()
Me.AllowDrop = True
End Sub

Private Sub MyTreeView_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.DoubleClick
MsgBox(CType(Me.SelectedNode, MyTreeNode).IpAddress)
End Sub

Private Sub MyTreeView_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
Try
If e.Data.GetDataPresent(GetType(MyTreeNode).ToString, False) Then
Dim pt As Point = CType(sender, TreeView).PointToClient(New Point(e.X, e.Y))
Dim DestinationNode As MyTreeNode = CType(CType(sender, TreeView).GetNodeAt(pt), MyTreeNode)
Dim NewNode As MyTreeNode = CType(e.Data.GetData(GetType(MyTreeNode).ToString), MyTreeNode)

'Method1
DestinationNode.Nodes.Add(NewNode.Clone)
DestinationNode.Expand()
NewNode.Remove()

'Method2
'Me.Nodes.Remove(NewNode)
'DestinationNode.Nodes.Add(NewNode)
'DestinationNode.Expand()
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub

Private Sub MyTreeView_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragEnter
e.Effect = DragDropEffects.Move
End Sub

Private Sub MyTreeView_ItemDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.ItemDragEventArgs) Handles Me.ItemDrag
Me.DoDragDrop(e.Item, DragDropEffects.Move)
End Sub

End Class

Public Class MyTreeNode
Inherits TreeNode

Dim mIp As String

Property IpAddress() As String
Get
Return mIp
End Get
Set(ByVal value As String)
mIp = value
End Set
End Property

Sub New()
Me.Text = "Default"
Me.IpAddress = "0.0.0.0"
End Sub

Sub New(ByVal Text As String, ByVal Ip As String)
Me.Text = Text
Me.IpAddress = Ip
End Sub

End Class


/////////////////////////////////////
MyTreeView_DragDrop方法中有两种Method1和Method2,如果我把节点Test拖动到ParentNode2或ParentNode3上后,为什么两种方式执行以后,DoubleClick节点Test,结果不一样呢?
...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhiyuan_zhang 2006-12-07
  • 打赏
  • 举报
回复
关注中
farrio 2006-12-07
  • 打赏
  • 举报
回复
在你的MyTreeNode里面加入
Public Overrides Function Clone() As Object
Dim ret As MyTreeNode = MyBase.Clone
ret.IpAddress = Me.IpAddress
Return ret
End Function

默认的Clone方法只支持浅表副本实现,只有顶级对象是重复的,并且顶级以下的对象包含引用。我怀疑IpAddress成员由于是String类型的,所以不能被复制。

Ps:我感觉你的提问方法有点问题,将近一屏的代码没什么人愿意认真地看。而且你的代码也不是那种立即就能运行的。你的问题是这段代码运行结果不对,那么别人就更加无法只通过看来帮你分析了。我觉得首先自己分析一下,如果提问“为什么自定义的TreeNode属性没办法Clone出来”,我想会有很多人解答的。你觉得呢。
wzuomin 2006-12-07
  • 打赏
  • 举报
回复
clone出来好像也不行啊。真不知道怎么回事儿?

既然Drag以后Test的ip变为"0.0.0.0",那肯定clone操作执行的是无参数的构造函数,
那为什么Test节点的Text却没变成 "Default"呢?

好像关注的人不多阿?
farrio 2006-12-06
  • 打赏
  • 举报
回复
我做treeview拖拽的时候,记得要把drag的node clone出来操作,直接操作会有问题。
wzuomin 2006-12-06
  • 打赏
  • 举报
回复
没人回答呀?自己顶一下。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧