CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  数据库(包含打印,安装,报表)

请教TreeView控件的使用技巧

楼主billow_chentao(巨浪)2004-09-04 01:39:19 在 VB / 数据库(包含打印,安装,报表) 提问

当父节点的NodeCheck事件发生时,如果父节点的CHECK属性等于TRUE,自动将所有子节点的CHECK属性改写为TRUE,否则改写为FALSE。  
  简单的说就是,当上级被选择时自动把全部下级选择,当上级选择被清除时自动把全部下级清除。  
  怎样实现? 问题点数:20、回复次数:5Top

1 楼gpyrbn(不想饿死)回复于 2004-09-04 08:58:03 得分 5

我顶     我也不太明白Top

2 楼XLYT(雨田)回复于 2004-09-04 09:48:27 得分 5

参考下列代码:  
   
  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  
  Top

3 楼SafeF8(A++.NET)回复于 2004-09-04 10:25:33 得分 5

'这个例子演示了如何向一个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  
  Top

4 楼SafeF8(A++.NET)回复于 2004-09-04 10:25:51 得分 5

'*****************************************************************  
  '功能:   返回一个不会重复的关键词  
  '输入:   空  
  '输出:  
  '     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  
  Top

5 楼billow_chentao(巨浪)回复于 2004-09-06 04:47:11 得分 0

谢谢,   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  
  Top

相关问题

  • treeview控件怎么使用?
  • TreeView控件怎么使用,
  • TreeView控件的使用?
  • treeview 控件的使用
  • 如何使用TreeView控件配合DataSource控件使用?
  • 怎样使用VB6中TREEVIEW控件?
  • VB的treeview控件任何使用
  • 如何在php中使用treeview控件?
  • 如何在access中使用treeview控件?
  • ASP.NET中如何使用TreeView控件

关键词

  • 结点
  • 控件
  • treeview
  • skey
  • getnextkey
  • iindex
  • 添加
  • ihold
  • submyerr
  • subprivate

得分解答快速导航

  • 帖主:billow_chentao
  • gpyrbn
  • XLYT
  • SafeF8
  • SafeF8

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo