WPS Office2007下载
首页 >> 技术文章 >> Office2007综合 >> Excel2003


树形目录控件——TreeView控件介绍

[示例七] 综合示例(2)——制作省市树形图(根据一个VB示例修改整理)
本示例如下图19所示,允许在运行时生成节点数据、编辑节点标签以及将TreeView的数据保存到XML文件或者从XML文件读取数据。
 
图19:示例界面,一个TreeView控件、三个命令按钮、一个文字框用于提示操作。
(1) 规划键击事件
修改用户界面控件的默认行为不仅要考虑到用户如何通过鼠标访问新的控件功能,而且还要允许用户使用键盘操作。TreeView默认支持下列键击事件:
● 上下两个箭头键移动光标(变换当前被选中的节点)。
● 左右箭头键除了变换当前被选中的节点之外,兼具扩展/折叠节点功能及生成节点的功能。
● Enter键扩展或折叠节点及生成节点的功能。
另外添加几个事件:
● 按Insert键在当前选中的节点之下插入一个新的节点。如果要添加一个新的根节点,按Ctrl+Insert键。用户按下Insert键之后,控件自动进入编辑状态,再按Enter键可退出编辑状态,控件自动选中父节点,以便用户只需按一下Insert键就可以在同一父节点之下插入新节点。
● 按Delete键删除当前选中的节点。如果被删除的节点包含子节点,所有子节点也被同时删除。
● 按Space键使当前选中的节点进入编辑状态。
(2)设计事件的句柄
TreeView控件的KeyDown事件句柄处理所有涉及键击的编辑操作,它用一个Select Case块判断用户按下的键,每一个Case语句对应一个键击事件。当用户按下Space键时,调用StartLabelEdit方法将节点转入编辑模式。如果被按下的是Delete键,则调用TreeView.Nodes集合的Remove方法删除当前选中的节点。对于Insert键,则用下面的代码在当前选中的节点下添加一个新节点,使新节点处于编辑模式:
Set currNode = SmartTreeView.Nodes.Add (SmartTreeView.SelectedItem, tvwChild)
currNode.Text = ""
currNode.Selected = True
SmartTreeView.StartLabelEdit
如果用户按下了Ctrl+Insert键,通过下面的代码添加一个新的根节点并让它处于编辑状态:
If Shift And vbCtrlMask Then
 Set currNode = SmartTreeView.Nodes.Add()
 currNode.Selected = True
 SmartTreeView.StartLabelEdit
End If
每一个节点必须有一个键——字符串形式的标识符。对于新添加的或编辑过的节点,我们在编辑操作结束时生成一个1到10000000之间的随机数字,加上前缀“K”,以此作为节点的键。由于Rnd()函数不保证随机数字的唯一性,所以我们使用了一个循环,如果第一次生成的键已经被使用,VB会触发一个错误,这时我们继续循环,寻找另外的键。
Dim Repeat As Boolean
Repeat = True
While Repeat
 On Error Resume Next
 SmartTreeView.SelectedItem.Key = "K" & 1 + Int(Rnd() * 10000000)
 If Err.Number = 0 Then Repeat = False
Wend
(3)保存节点数据
TreeView本身没有提供保存节点数据的Save方法,也没有从文件读取节点数据的Load方法,这些方法都要我们自己实现。保存TreeView数据最简单的形式是XML文件,因为层次型结构是XML固有的特征。我们将用MSXML组件来创建和保存XML文档,在VBE编程器中,选择“工具”——“引用”,打开“引用”对话框,在对话框中选中“Microsoft XML, v3.0”以上的组件。单击“保存”按钮,控件的当前数据将被保存为一个“扁平”XML文件(如图20所示):每一个节点保存为一个XML元素,节点的属性作为XML元素的属性保存,节点之间的从属关系通过元素的ParentKey属性得以体现。下面是“保存”按钮单击事件句柄的代码:
Private Sub bttnSave_Click()
 Dim xmlDoc As DOMDocument30
 Set xmlDoc = New DOMDocument30

 Dim ElementNode As IXMLDOMElement
 Dim RootElementNode As IXMLDOMElement
 Set ElementNode = xmlDoc.createElement("NODES")
 Set RootElementNode = xmlDoc.appendChild(ElementNode)

 Dim TNode As Node
 Dim i As Integer
 For i = 1 To SmartTreeView.Nodes.Count
  Set TNode = SmartTreeView.Nodes(i)
  Set ElementNode = xmlDoc.createElement("NODE")
  ElementNode.setAttribute "Caption", TNode.Text
  ElementNode.setAttribute "Key", TNode.Key
  ElementNode.setAttribute "Tag", TNode.Tag
  If TNode.Parent Is Nothing Then
   ElementNode.setAttribute "ParentKey", ""
  Else
   ElementNode.setAttribute "ParentKey", TNode.Parent.Key
  End If
  RootElementNode.appendChild ElementNode
 Next
 xmlDoc.save ("C:\XMLNodes.xml")
End Sub
bttnSave_Click事件句柄首先创建根元素,然后用一个For...Next循环遍历TreeView控件的节点集合,每次循环创建一个新的元素,提取节点的属性作为XML元素的属性。
 
图20:保存为XML文件
(4)读取节点数据
“读取XML文档”按钮的Click事件句柄首先创建一个DOMDocument对象,然后读入XML文档。接着,利用getElementsByTagName依次获取各个节点,分别设置节点的各个属性,最终构造出原先保存的TreeView,如下所示:
Private Sub bttnLoad_Click()
 Dim xmlDoc As DOMDocument30
 Set xmlDoc = New DOMDocument30
 If Not xmlDoc.Load("C:\XMLNodes.xml") Then
  MsgBox "不能读取C:\XMLNodes.xml文件。"
  Exit Sub
 End If
 SmartTreeView.Nodes.Clear
 Dim iNode As Integer
 Dim newElement As IXMLDOMElement
 For iNode = 0 To xmlDoc.getElementsByTagName("NODE").length - 1
  Set newElement = xmlDoc.getElementsByTagName ("NODE").Item(iNode)
  If newElement.getAttribute("ParentKey") = "" Then
   SmartTreeView.Nodes.Add , , _
   newElement.getAttribute("Key"), _
   newElement.getAttribute("Caption")
  Else
   SmartTreeView.Nodes.Add _
   newElement.getAttribute("ParentKey"), _
   tvwChild, newElement.getAttribute("Key"),newElement.getAttribute("Caption")
  End If
 Next
End Sub
(5)本示例的完整代码如下:
Option Explicit
Private Sub bttnPopulate_Click()
  Dim nodx As Node
  '设置外观
  SmartTreeView.LineStyle = 1
 
  SmartTreeView.Nodes.Clear
 
  '建立树形图
  Set nodx = SmartTreeView.Nodes.Add(, , "湖北省", "湖北省")
  Set nodx = SmartTreeView.Nodes.Add(, , "江苏省", "江苏省")
 
  Set nodx = SmartTreeView.Nodes.Add("湖北省", tvwChild, "武汉市", "武汉市")
  Set nodx = SmartTreeView.Nodes.Add("湖北省", tvwChild, "宜昌市", "宜昌市")
  Set nodx = SmartTreeView.Nodes.Add("武汉市", tvwChild, "wchild01", "江汉区")
  Set nodx = SmartTreeView.Nodes.Add("武汉市", tvwChild, "wchild02", "江岸区")
  Set nodx = SmartTreeView.Nodes.Add("武汉市", tvwChild, "wchild03", "汉口区")
  Set nodx = SmartTreeView.Nodes.Add("武汉市", tvwChild, "wchild04", "汉阳区")
  Set nodx = SmartTreeView.Nodes.Add("武汉市", tvwChild, "wchild05", "武昌区")
  Set nodx = SmartTreeView.Nodes.Add("武汉市", tvwChild, "wchild06", "青山区")
  Set nodx = SmartTreeView.Nodes.Add("武汉市", tvwChild, "wchild07", "洪山区")
  Set nodx = SmartTreeView.Nodes.Add("宜昌市", tvwChild, "ychild01", "西陵区")
  Set nodx = SmartTreeView.Nodes.Add("宜昌市", tvwChild, "ychild02", "武家岗区")
  Set nodx = SmartTreeView.Nodes.Add("宜昌市", tvwChild, "ychild03", "点军区")
  Set nodx = SmartTreeView.Nodes.Add("宜昌市", tvwChild, "ychild04", "夷陵区")
 
  Set nodx = SmartTreeView.Nodes.Add("江苏省", tvwChild, "南京市", "南京市")
  Set nodx = SmartTreeView.Nodes.Add("江苏省", tvwChild, "南通市", "南通市")
  Set nodx = SmartTreeView.Nodes.Add("南京市", tvwChild, "nchild01", "玄武区")
  Set nodx = SmartTreeView.Nodes.Add("南京市", tvwChild, "nchild02", "秦淮区")
  Set nodx = SmartTreeView.Nodes.Add("南京市", tvwChild, "nchild03", "江宁区")
  Set nodx = SmartTreeView.Nodes.Add("南京市", tvwChild, "nchild04", "建邺区")
  Set nodx = SmartTreeView.Nodes.Add("南京市", tvwChild, "nchild05", "鼓楼区")
  Set nodx = SmartTreeView.Nodes.Add("南京市", tvwChild, "nchild06", "六合区")
  Set nodx = SmartTreeView.Nodes.Add("南京市", tvwChild, "nchild07", "栖霞区")
  Set nodx = SmartTreeView.Nodes.Add("南通市", tvwChild, "nchild08", "崇明")
  Set nodx = SmartTreeView.Nodes.Add("南通市", tvwChild, "nchild09", "启东")
  Set nodx = SmartTreeView.Nodes.Add("南通市", tvwChild, "nchild10", "海门")
  Set nodx = SmartTreeView.Nodes.Add("南通市", tvwChild, "nchild11", "靖江")
 
End Sub

Private Sub bttnSave_Click()
  Dim xmlDoc As DOMDocument30
  Set xmlDoc = New DOMDocument30

  Dim ElementNode As IXMLDOMElement
  Dim RootElementNode As IXMLDOMElement
  Set ElementNode = xmlDoc.createElement("NODES")
  Set RootElementNode = xmlDoc.appendChild(ElementNode)

  Dim TNode As Node
  Dim i As Integer
  For i = 1 To SmartTreeView.Nodes.Count
    Set TNode = SmartTreeView.Nodes(i)
    Set ElementNode = xmlDoc.createElement("NODE")
    ElementNode.setAttribute "Caption", TNode.Text
    ElementNode.setAttribute "Key", TNode.Key
    ElementNode.setAttribute "Tag", TNode.Tag
    If TNode.Parent Is Nothing Then
      ElementNode.setAttribute "ParentKey", ""
    Else
      ElementNode.setAttribute "ParentKey", TNode.Parent.Key
    End If
    RootElementNode.appendChild ElementNode
  Next
  xmlDoc.Save ("C:\XMLNodes.xml")
End Sub

Private Sub bttnLoaded_Click()
  Dim xmlDoc As DOMDocument30
  Set xmlDoc = New DOMDocument30
  bttnPopulate.Enabled = False
  If Not xmlDoc.Load("C:\XMLNodes.xml") Then
    MsgBox "不能读取C:\XMLNodes.xml文件。"
    Exit Sub
  End If
  SmartTreeView.Nodes.Clear
  Dim iNode As Integer
  Dim newElement As IXMLDOMElement
  For iNode = 0 To xmlDoc.getElementsByTagName("NODE").Length - 1
    Set newElement = xmlDoc.getElementsByTagName("NODE").Item(iNode)
    If newElement.getAttribute("ParentKey") = "" Then
      SmartTreeView.Nodes.Add , , _
      newElement.getAttribute("Key"), _
      newElement.getAttribute("Caption")
    Else
      SmartTreeView.Nodes.Add _
      newElement.getAttribute("ParentKey"), _
      tvwChild, newElement.getAttribute("Key"), newElement.getAttribute("Caption")
    End If
  Next
End Sub

Private Sub SmartTreeView_KeyDown(KeyCode As Integer, ByVal Shift As Integer)
  Dim currNode
  Dim Repeat As Boolean
  Select Case KeyCode
    Case vbKeySpace
      SmartTreeView.StartLabelEdit
    Case vbKeyDelete
      SmartTreeView.Nodes.Remove SmartTreeView.SelectedItem.Index
    Case vbKeyInsert
      Set currNode = SmartTreeView.Nodes.Add(SmartTreeView.SelectedItem, tvwChild)
      currNode.Text = ""
      currNode.Selected = True
      SmartTreeView.StartLabelEdit
      If Shift And 2 Then
        Set currNode = SmartTreeView.Nodes.Add()
        currNode.Selected = True
        SmartTreeView.StartLabelEdit
      End If
  End Select
  Repeat = True
  While Repeat
    On Error Resume Next
    SmartTreeView.SelectedItem.Key = "K" & 1 + Int(Rnd() * 10000000)
    If Err.Number = 0 Then Repeat = False
  Wend
End Sub

声明:欢迎各大网站转载本站文章,还请保留一条能直接指向本站的超级链接,谢谢!

第1页 | 第2页 | 第3页 | 第4页 | 第5页 | 第6页 | 第7页

时间:2007-9-26 21:11:51,点击:0打印】【关闭

上一篇:在office Excel页眉页脚中插入图片
下一篇:利用VBA创建Excel新菜单

OfficeBa论坛】:阅读本文时遇到了什么问题,可以到论坛进行交流!Excel专家邮件:342327115@qq.com(大家在Excel使用中遇到什么问题,可以咨询此邮箱)。

【声明】:以上文章或资料除注明为Office吧自创或编辑整理外,均为各方收集或网友推荐所得。其中摘录的内容以共享、研究为目的,不存在任何商业考虑。如有任何异议,请与本站联系,联系邮箱:thinkou@126.com,本站确认后将立即撤下。谢谢您的支持与理解!


相关评论

我要评论

查看所有评论内容

评论内容