于晓静 管建和
摘 要本文通过对TreeView控件的拖拽组合等复杂操作的程序设计,分析了TreeView控件在复杂应用中编程实现的技术难点。
关键词 TreeView控件,TreeNode,C#,拖拽组合
一、前言
在.NET框架中,TreeView控件可谓功能强大,几乎所有需要显示分级信息的应用程序都能由它实现。通常对于一个较简单的应用程序来说,提供内容的分级显示和一些简单的操作就已经足够满足需求,然而在一些复杂应用中,这种功能上的局限性就将捉襟见肘了。
譬如对于实现的一个树型控件,当用户需要对它进行这样的修改——仅调整树型控件节点的位置而不修改树型结构上节点的值时,最简单快捷的方法就是对节点实施拖拽操作从而实现位置的变更。而通常实现的树型结构无法做到这点,因为它仅仅定义了简单的增删改操作,所以用户只能通过繁琐的反复删除、添加相应节点及其子树来完成需要的修改。当树型结构分支或节点数目较多时,操作费时且易出错。因此,针对类似复杂应用的需求,文章将详细介绍一个TreeView控件拖拽组合等复杂操作实例的实现并分析其技术难点。
二、TreeView常规操作的实现
如应用程序界面图1所示,由于左右两边的树型结构的实现基本一样,因此本文仅以左边的TreeView控件tvwLeft为例来说明的基本增删改操作的编程实现。
图1 TreeView弹出式菜单效果图
1.弹出式右键菜单的实现
首先从工具箱中拖出一个ContextMenu控件,然后选择tvwLeft树型控件,在“属性”窗口的“事件”元素下为tvwLeft树型控件编写MouseDown事件的处理方法,代码如下:
private void tvwLeft_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{//在tvwLeft工作区内单击鼠标右键时,弹出相应操作菜单
if (e.Button==MouseButtons.Right )
{ //判断是否是在树节点上单击的鼠标右键
if(!Object.Equals(((TreeView) sender).GetNodeAt(e.X,e.Y),null))
{ //获得当前选中的树节点
((TreeView) sender).SelectedNode=((TreeView) sender).GetNodeAt(e.X,e.Y);
if(!Object.Equals(((TreeView) sender).SelectedNode.Parent,null))
|