请教TreeView控件的使用技巧

billow_chentao 2004-09-04 01:39:19
当父节点的NodeCheck事件发生时,如果父节点的CHECK属性等于TRUE,自动将所有子节点的CHECK属性改写为TRUE,否则改写为FALSE。
简单的说就是,当上级被选择时自动把全部下级选择,当上级选择被清除时自动把全部下级清除。
怎样实现?
...全文
191 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
billow_chentao 2004-09-06
谢谢, XLYT(雨田),
我修改后的代码
Private Sub tvwBudget_NodeCheck(ByVal Node As MSComctlLib.Node)
Dim ii As Integer
Dim first As Node
Dim k As String
k = Node.Key
Set first = Node.Child
For ii = 1 To Node.Children
If Not first.Parent.Key = k Then Exit For
first.Checked = Node.Checked
Set first = first.Next
Next
End Sub
回复
SafeF8 2004-09-04
'*****************************************************************
'功能: 返回一个不会重复的关键词
'输入: 空
'输出:
' 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
回复
SafeF8 2004-09-04
'这个例子演示了如何向一个TreeView控件增加、减少结点
'增加结点的方式包括了增加“兄弟姐妹”结点:这种情况也四种增加方式,分别
'是最初、最后、下一个和上一个。也包含了增加子结点的方式
'这样就使用了TreeView控件中的这5种关系。
'另外,该例子也演示例如何通过拖放操作来对结点进行位置上的改变
'拖放操作是比较广泛的一种Windows操作,在本例子之后将对其进行介绍

'本例需要一7个commandbutton: cmdfist ,cmdLast ,cmdNext,cmdPrevious ,cmdChild,cmdRemove,cmdClear
'一个ImageList1,其中Imangelist1中放置两个图片
Option Explicit

Dim mnIndex As Integer ' 存放一个结点的索引
Dim mbIndrag As Boolean ' 拖放操作的信号标志
Dim moDragNode As Object ' 被拖动的条目

Private Sub cmdChild_Click()
'用tvwChild方式来增加一个结点
Dim oNodex As Node
Dim skey As String
Dim iIndex As Integer

'如果没有当前选中的结点,则出错。
'因为必须在增加结点之前指定好位置
On Error GoTo myerr
'检测是否选中一个结点,并获取其索引
iIndex = TreeView1.SelectedItem.Index
skey = GetNextKey() ' 调用函数,自动为要添加的项生成一个关键词
Set oNodex = TreeView1.Nodes.Add(iIndex, tvwChild, skey, "Child " & skey, 1, 2)
oNodex.EnsureVisible '确认新添的结点可见
Exit Sub
myerr:
'如果出现错误,则通知用户,先从TreeView中选择一个结点
MsgBox ("必须先选择一个结点才能添加!" & vbCrLf _
& "如果TreeView是空的,那么就用Add Last Sibling按钮添加一个结点!")
Exit Sub
End Sub

Private Sub cmdClear_Click()
Cls
TreeView1.Nodes.Clear
End Sub
Private Sub cmdFirst_Click()
'用关系tvwFirst添加结点
Dim skey As String
Dim iIndex As Integer

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

Private Sub cmdLast_Click()
'用关系tvwLast添加一个结点
Dim skey As String
skey = GetNextKey()

'如果没有当前选中的结点,则出错。
'因为必须在增加结点之前指定好位置
On Error GoTo myerr
TreeView1.Nodes.Add TreeView1.SelectedItem.Index, tvwLast, skey, "Last " & skey, 1, 2
Exit Sub
myerr:
'如果没有其他被选中的结点,则添加一个Root结点
TreeView1.Nodes.Add , tvwLast, skey, "Last " & skey, 1, 2
Exit Sub
End Sub
回复
XLYT 2004-09-04
参考下列代码:

Private Sub Form_Load()
Dim Newnode As Node

Set Newnode = TreeView1.Nodes.Add(, , "R", "Root")
Set Newnode = TreeView1.Nodes.Add("R", tvwChild, "C1", "Child1")
Set Newnode = TreeView1.Nodes.Add("R", tvwChild, "C2", "Child2")
Set Newnode = TreeView1.Nodes.Add("C1", tvwChild, "CC1", "CChild1")
Set Newnode = TreeView1.Nodes.Add("C1", tvwChild, "CC2", "CChild2")
Set Newnode = TreeView1.Nodes.Add("C1", tvwChild, "CC3", "CChild3")
Set Newnode = TreeView1.Nodes.Add("C1", tvwChild, "CC4", "CChild4")
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Dim ii As Integer
Dim first As Node

If Node.Key = "C1" Then
Set first = Node.Child
For ii = 1 To Node.Children
If Not first.Parent.Key = "C1" Then Exit For
MsgBox first.Text
Set first = first.Next
Next
End If
End Sub
回复
gpyrbn 2004-09-04
我顶 我也不太明白
回复
相关推荐
发帖

1188

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
帖子事件
创建了帖子
2004-09-04 01:39
社区公告
暂无公告