TreeView是最灵活的Windows控件之一,它以分层的形式显示数据,允许用户随意扩展或折叠节点。鉴于实际生活中许多事物有着层次关系,如计算机里的文件夹、人事组织关系、地区从属关系等,TreeView的应用也极其广泛。但在实际开发中,许多人不喜欢使用TreeView,主要是由于默认的TreeView是“只读”的,不支持添加、删除、编辑、调整节点位置等操作。本文将通过一个TVEdit工程说明如何解决这些问题。
TVEdit工程(图一)允许在运行时生成节点数据、编辑节点标签、通过拖放操作改变节点的位置,以及将TreeView的数据保存到XML文件或从XML文件读取。

图一
一、规划键击事件
修改用户界面控件的默认行为不仅要考虑到用户如何通过鼠标访问新的控件功能,而且还要允许用户使用键盘操作。TreeView默认支持下列键击事件:
▲ 上下两个箭头键移动光标(变换当前被选中的节点)。
▲ 左右箭头键除了变换当前被选中的节点之外,兼具扩展/折叠节点功能。
▲ Enter键扩展或折叠节点。
TVEdit工程不改变这些默认的键击行为。但由于TreeView默认的键击事件不允许用户编辑其内容,所以我们要另外添加几个事件:
▲ 按Insert键在当前选中的节点之下插入一个新的节点。如果要添加一个新的根节点,按Ctrl Insert键。用户按下Insert键之后,控件自动进入编辑状态,再按Enter键可退出编辑状态,控件自动选中父节点,以便用户只需按一下Insert键就可以在同一父节点之下插入新节点。
▲ 按Space键(或鼠标停留较长时间)使当前选中的节点进入编辑状态(也许有的人更乐意用Enter键进入编辑状态,但TreeView控件已经定义了Enter键的默认行为,所以这里不再用它)。
▲ 按Delete键删除当前选中的节点。如果被删除的节点包含子节点,所有子节点也被同时删除。
▲ 用鼠标拖放节点可改变节点在TreeView分层结构中的位置。如果被拖动的节点包含子节点,所有子节点也将被移动。 二、设计事件的句柄
在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
三、拖放操作
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
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关文章
热点关注
- 在asp.net中为Web用户控件
- .NET3.5和VS2008中的ASP.N
- 对.NET Framework 反射的
- Asp.net Ajax 1.0 异步回
- ASP.NET2.0的控件状态和视
- 通过避免下列10个常见ASP.
- 中国地区三级联动下拉菜单
- 解析Asp.net中资源本地化
- 一个无刷新效果定时自动更
- 动态创建MSSQL数据库表存
- asp.net用url重写URLReWri
- 使用ASP.NET Atlas编写显
- 关于ASP.NET调用JavaScrip
- 使用ASP.Net Forms模式实
- asp.net ajax 使用updatep
- 优化ASP.NET应用程序性能
- ASP.NET中动态修改web.con
- ASP.NET中利用Crystal Rep
- asp.net如何生成图片验证
- 基于ASP.NET的Web动态控件
- 分享个极好的无刷新二级联
- asp.net 2.0 上传控件的使
- 创建ASP.NET监视服务器进
- Asp.net把UTF-8编码转换为
- 开发基于ASP.NET WebServi
- asp.net结合html,javascr
- asp.net 2.0下嵌套masterp
- 正则表达式提取数字
- 最新版FreeTextBox(版本3.
- 获取本机上配置好的Oracle
- ASP.Net全局变量的设置和
- VB几个有用的函数
- 用代码画折线图/柱形图/
- FCKeditor2.2 ASP.NET2.0
- 客户端回调实现gridView无
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD




