treeview控件中如何使节点移动?

eileendl 2004-09-08 11:15:37
资源浏览器中左边的文件夹treeview中各个节点可以通过鼠标拖动随意移动节点位置。
不知道在vb中如何实现?
...全文
199 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2004-09-09
  • 打赏
  • 举报
回复
http://www.vb-helper.com/HowTo/howto_drag_treeview_nodes.zip
starsoulxp 2004-09-09
  • 打赏
  • 举报
回复
*****************************************************************
'功能: 返回一个不会重复的关键词
'输入: 空
'输出:
' GetNextKey String
'实现算法很简单,只是在每次添加新结点的时候,对所有结点的数量加1
'由于每个Key是唯一的,因此如果用户可以删除结点,则这个算法不适用
'本例子允许删除结点,不过,还是演示了这种方法
'******************************************************************
Private Function GetNextKey() As String
Dim sNewKey As String
Dim iHold As Integer
Dim i As Integer

On Error GoTo myerr
'如果TreeView为空,则下行代码将会出错。
iHold = Val(TreeView1.Nodes(1).Key)
For i = 1 To TreeView1.Nodes.Count
If Val(TreeView1.Nodes(i).Key) > iHold Then
iHold = Val(TreeView1.Nodes(i).Key)
End If
Next
iHold = iHold + 1
sNewKey = CStr(iHold) & "_"
GetNextKey = sNewKey
Exit Function
myerr:
'如果TreeView为空,则新增的结点为第一个结点,索引为1
GetNextKey = "1_"
Exit Function
End Function

Private Sub cmdNext_Click()
'用tvwNext添加结点
Dim skey As String
Dim iIndex As Integer

'如果没有当前选中的结点,则出错。
'因为必须在增加结点之前指定好位置
On Error GoTo myerr
iIndex = TreeView1.SelectedItem.Index
skey = GetNextKey()
TreeView1.Nodes.Add iIndex, tvwNext, skey, "Next " & skey, 1, 2
Exit Sub
myerr:
'如果出现错误,则通知用户,先从TreeView中选择一个结点
MsgBox ("必须先选择一个结点才能添加!" & vbCrLf _
& "如果TreeView是空的,那么就用Add Last Sibling按钮添加一个结点!")
Exit Sub
End Sub

Private Sub cmdPrevious_Click()
'用tvwPrevious添加结点
Dim skey As String
Dim iIndex As Integer

'如果没有当前选中的结点,则出错。
'因为必须在增加结点之前指定好位置
On Error GoTo myerr
iIndex = TreeView1.SelectedItem.Index
skey = GetNextKey()
TreeView1.Nodes.Add iIndex, tvwPrevious, skey, "Previous " & skey, 1, 2
Exit Sub
myerr:
'如果出现错误,则通知用户,先从TreeView中选择一个结点
MsgBox ("必须先选择一个结点才能添加!" & vbCrLf _
& "如果TreeView是空的,那么就用Add Last Sibling按钮添加一个结点!")
Exit Sub
End Sub

Private Sub cmdRemove_Click()
'删除被选结点
Dim iIndex As Integer

'如果没有当前选中的结点,则出错。
'因为必须在增加结点之前指定好位置
On Error GoTo myerr
iIndex = TreeView1.SelectedItem.Index
TreeView1.Nodes.Remove iIndex '删除一个结点以及它的所有子结点
Exit Sub
myerr:
'如果出现错误,则通知用户,先从TreeView中选择一个结点
MsgBox ("必须先选择一个结点才能添加!" & vbCrLf _
& "如果TreeView是空的,那么就用Add Last Sibling按钮添加一个结点!")
Exit Sub
End Sub

Private Sub Form_Load()
'预先设置好TreeView,不让其为空
TreeView1.ImageList = ImageList1
Set moDragNode = Nothing
cmdLast_Click
cmdLast_Click
TreeView1.Nodes(1).Selected = True
cmdChild_Click
End Sub

Private Sub TreeView1_Click()
MsgBox TreeView1.SelectedItem.Index
End Sub

Private Sub TreeView1_DragDrop(Source As Control, x As Single, y As Single)
'如果用户没有移动鼠标,或目标位置不正确,则不执行拖放
'并将拖放操作标志设为False
If TreeView1.DropHighlight Is Nothing Then
mbIndrag = False
Exit Sub
Else
'将被拖放的结点的父结点属性设置为目的结点
On Error GoTo checkerror '防止出现循环拖动
Set moDragNode.Parent = TreeView1.DropHighlight
'清屏,并在屏幕上打印出一行字,显示拖放后结点的位置关系
Cls
Print TreeView1.DropHighlight.Text & _
" is parent of " & moDragNode.Text

' 清除用来标志拖放目的地的高亮显示设置
Set TreeView1.DropHighlight = Nothing
'拖放结束,将操作标志符设置为False
mbIndrag = False
'清除被拖放的结点在源位置的结点
Set moDragNode = Nothing
Exit Sub
End If

checkerror:
Const CircularError = 35614
If Err.Number = CircularError Then
Dim msg As String
msg = "不能将一个父结点拖放变成自身子节点的子结点!"

If MsgBox(msg, vbExclamation & vbOKCancel) = vbOK Then
mbIndrag = False
Set TreeView1.DropHighlight = Nothing
Exit Sub
End If
End If
End Sub

Private Sub TreeView1_DragOver(Source As Control, x As Single, y As Single, State As Integer)
If mbIndrag = True Then
'当鼠标移到正确的目的控件上时,高亮显示该控件
Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
End If
End Sub

Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)

'确定是在一个结点对象之上
If Not TreeView1.DropHighlight Is Nothing Then
'将moDragNode结点设置为将要被选择的结点
'如果不这样做,那就要直到单击完结点后才选择结点
TreeView1.SelectedItem = TreeView1.HitTest(x, y)
Set moDragNode = TreeView1.SelectedItem '设置该结点为要拖动的对象
End If
Set TreeView1.DropHighlight = Nothing
End Sub

Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
'确定鼠标左键按下状态
If Button = vbLeftButton Then '标志一个拖动操作
mbIndrag = True '设置拖放标志为True
' 设置拖放时的图标显示情况
TreeView1.DragIcon = TreeView1.SelectedItem.CreateDragImage
TreeView1.Drag vbBeginDrag ' 开始拖动操作
End If
End Sub
cnapc 2004-09-09
  • 打赏
  • 举报
回复
treeview 中有一个拖动和放下的事件,可以看MSDN
online 2004-09-08
  • 打赏
  • 举报
回复
http://www.moon-soft.com/download/other/index2.htm
treelist.ZIP 使用TreeView和ListView显示数据库的数据(7KB)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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