前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

VB中TreeView控件利用实例教程

时候:2012-06-17 15:24来源:知行网www.zhixing123.cn 编辑:麦田守望者

择要:]在实际开辟中,很多人不喜欢利用TreeView,主如果因为默许的TreeView是“只读”的,不支撑增加、删除、编辑、调剂节点地位等操纵。本文经由过程一个TVEdit工程申明若那边理这些问题。

  TreeView是最矫捷的Windows控件之一,它以分层的情势显现数据,许可用户随便扩展或折叠节点。鉴于实际糊口中很多事物有着层次关系,如计较机里的文件夹、人事构造关系、地区附属关系等,TreeView的利用也极其遍及。但在实际开辟中,很多人不喜欢利用TreeView,主如果因为默许的TreeView是“只读”的,不支撑增加、删除、编辑、调剂节点地位等操纵。本文将经由过程一个TVEdit工程申明若那边理这些问题。

  TVEdit工程(图一)许可在运行时天生节点数据、编辑节点标签、经由过程拖放操纵改叛变点的地位,和将TreeView的数据保存到XML文件或从XML文件读取。

 

VB中TreeView控件使用实例教程
VB中TreeView控件利用实例教程
 

 

  一、打算键击事件

  点窜用户界面控件的默许行动不但要考虑到用户若何经由过程鼠标拜候新的控件服从,并且还要许可用户利用键盘操纵。TreeView默许支撑以下键击事件:

   ▲ 上下两个箭头键挪动光标(变更以后被选中的节点)。

   ▲ 摆布箭头键除变更以后被选中的节点以外,兼具扩展/折叠节点服从。

   ▲ Enter键扩展或折叠节点。

  TVEdit工程不改变这些默许的键击行动。但因为TreeView默许的键击事件不许可用户编辑其内容,所以我们要别的增加几个事件:

   ▲ 按Insert键在以后选中的节点之下拔出一个新的节点。如果要增加一个新的根节点,按Ctrl+Insert键。用户按下Insert键以后,控件主动进入编辑状况,再按Enter键可加入编辑状况,控件主动选中父节点,以便用户只需按一下Insert键便可以在同一父节点之下拔出新节点。

   ▲ 按Space键(或鼠标逗留较长时候)使以后选中的节点进入编辑状况(或许有的人更甘愿答利用Enter键进入编辑状况,但TreeView控件已定义了Enter键的默许行动,所以这里不再用它)。

   ▲ 按Delete键删除以后选中的节点。如果被删除的节点包含子节点,所有子节点也被同时删除。

   ▲ 用鼠标拖放节点可改叛变点在TreeView分层布局中的地位。如果被拖动的节点包含子节点,所有子节点也将被挪动。
2、设想事件的句柄

  在TVEdit工程中,TreeView控件的KeyDown事件句柄措置所有触及键击的编辑操纵,它用一个Select Case块判定用户按下的键,每个Case语句对应一个键击事件。

  当用户按下Space键,我们调用StartLabelEdit体例将节点转入编辑形式。如果被按下的是Delete键,则调用TreeView.Nodes调集的Remove体例删除以后选中的节点。对Insert键,则用下面的代码在以后选中的节点下增加一个新节点,使新节点处于编辑形式:

Set currNode = SmartTreeView.Nodes.Add (SmartTreeView.SelectedItem, tvwChild)
currNode.Text = ""
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控件本身不支撑外部节点的拖放操纵,所以我们要实现OLE拖放事件的句柄。起首必须把控件的OLEDragMode属性设置成ccOLEDragAutomatic,把OLEDropMode属性设置成ccOLEDropManual。当用户开端拖动一个节点,控件触发OLEStartDrag事件:

Private Sub SmartTreeView_OLEStartDrag( _
Data As MSComctlLib.DataObject, _
AllowedEffects As Long)
 Data.Clear
 If Not Me.SmartTreeView.SelectedItem Is Nothing Then
  Data.SetData Me.SmartTreeView.SelectedItem.Key,vbCFText
 End If
End Sub

  OLEStartDrag事件句柄把Data参数设置成被拖放节点的Key属性,稍后我们可以看到这个值的用处。当用户用鼠标拖着节点挪动,VB触发OLEDragOver事件,下面给出了事件句柄的代码。当用户拖着节点颠末其他节点时,其他节点不会主动以高亮度色彩显现,所以我们必须将TreeView控件的DropHighlight属性设置到恰当的节点,以表白鼠标以后正处在该节点的地位上。鼠标地点地位的节点可经由过程控件的HitTest体例获知,HitTest体例的参数是指针的坐标。

Private Sub SmartTreeView_OLEDragOver _
(Data As MSComctlLib.DataObject, Effect As Long, _
Button As Integer, Shift As Integer, x As Single, _
y As Single, State As Integer)

 With SmartTreeView
  If State = vbLeave Then
   Set .DropHighlight = Nothing
  Else
   .DropHighlight = .HitTest(x, y)
  End If
 End With
 mfX = x
 mfY = y
 If y > 0 And y < 100 Then
  m_iScrollDir = -1
  Timer1.Enabled = True
 ElseIf y > (SmartTreeView.Height - 200) And _
  y < SmartTreeView.Height Then
  m_iScrollDir = 1
  Timer1.Enabled = True
 Else
  Timer1.Enabled = False
 End If
End Sub

  拖着节点颠末其他可见的节点不存在甚么问题,但要把节点拖到某个以后不在控件可见地区的节点就要复杂一些。为了实现这个服从,当鼠标拖着节点到达TreeView控件的顶部或底部时,我们必须强迫TreeView动弹其可见地区。TVEdit工程操纵了一个每200ms触发的Timer,以便阐发以后鼠标指针所处的地位。如果鼠标拖着节点到达间隔TreeView控件顶部或底部100 pixel的地位,控件显现的内容就必须动弹。有关这一技术的详细申明,有兴趣的读者可拜见MSDN文章Q177743。

  SmartTreeView_OLEDragOver事件句柄有几行代码用来判定是不是要动弹控件和开启Timer,但实际的动弹操纵由Timer的事件句柄完成。

  当用户拖着节点到达目标地后放开鼠标键,控件触发OLEDragDrop事件,这个事件句柄要提取出被拖动的节点,并把它放在以后高亮度显现的节点之下。前面我们把被拖动节点的Key放入了事件句柄的参数Data工具,现在可以操纵这个Key便利地从Notes调集获得被拖动的节点,只需把这个节点的ParentNode属性设置成以后高亮度显现的节点,就完成了挪动节点(及其所有子节点)的操纵。重视被拖动的节点不克不及放入它本身的子节点之下,因为这会构成父子节点相互援引的循环援引关系。

Private Sub SmartTreeView_OLEDragDrop( _
Data As MSComctlLib.DataObject, Effect As Long, _
Button As Integer, Shift As Integer, x As Single, _
y As Single)

 Dim strKey As String
 Dim thisNode, DragNode As Node

 Set oNode = Me.SmartTreeView.HitTest(x, y)

 If Data.GetFormat(vbCFText) Then
  strKey = Data.GetData(vbCFText)
  Set oDragNode = SmartTreeView.Nodes(strKey)
  On Error Resume Next
  Set oDragNode.Parent = oNode
  If Err.Number = 35614 Then
   MsgBox "节点不克不及挪动到此地位:不克不及建立循环援引关系。"
   On Error GoTo 0
  End If
  Set SmartTreeView.DropHighlight = Nothing
 End If
End Sub
4、保存节点数据

  TreeView本身没有供应保存节点数据的Save体例,也没有从文件读取节点数据的Load体例,这些体例都要我们本身实现。保存TreeView数据最简朴的情势是XML文件,因为层次型布局是XML固有的特性。我们将用MSXML组件来建立和保存XML文档,VB6默许不带这个组件,但你可以从MSDN下载。

  在VB中利用MSXML组件起首要把它插手工程:翻开“工程”菜单,挑选“援引”,在对话框当选中“Microsoft XML v3.0”组件。

 

VB中TreeView控件使用实例教程2
 

  点击“保存”按钮,控件的以后数据将被保存为一个“扁平”XML文件(图二):每个节点保存为一个XML元素,节点的属性作为XML元素的属性保存,节点之间的附属关系经由过程元素的ParentKey属性得以表现。下面是“保存”按钮点击事件句柄的代码。

顶一下
(4)
100%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):C# C#实例教程 c#根本教程 C#源代码 c#技能
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣