VS.NET2003 TREEVIEW实现CHECKBOX级联

 

1.     前言

很久没有用2003,本来正研究2008的新功能和framework3.5的新特性,由于项目的需要,重新用回2003。装上2003后,界面土的掉渣的也就忍了,使用上也有诸多不便,比如智能感知方面。控件也很少,比如常用的treeview,死活找不着,后来经过遥远的回忆,依稀记起那个仿佛需要另外安装。于是上网搜索下载IE Web Controls,安装,vs.net命令行运行安装目录下build.bat,将runtime里的所有文件拷贝至默认网站下"webctrl_client\1_0"中,在IDE中的工具栏中添加在编译好的dll,终于出现了treeview,翻倒自己原来写过的treeview代码,拷贝粘贴完事,欣喜若狂。生活不如意的事十有八九,这句话谁说的,真TMD太对了。运行之后,发现vs2005上对treeview操作的javascript脚本在vs2003完全不能用,于是就有了下面的事。

2.     XML数据绑定

2005treeviewxml绑定非常灵活,这里就不详述了,还是契合主题,讲讲2003下的xml数据绑定。首先创建一个xml文件,如下所示,必须以TreeNodes为根,同时所有的节点都以treenodetag

<?xml version="1.0" encoding="utf-8" ?>

<TREENODES>

     <treenode text="test">

         <treenode text="test">

         </treenode >

         <treenode text="test">

         </treenode >

         <treenode text="test">

         </treenode >

     </treenode >

     <treenode text="test"></treenode>

</TREENODES>

数据绑定时,使用如下代码

MessageTypeTree.TreeNodeSrc="MessageTypeData.xml";

MessageTypeTree.DataBind();

3.     使用checkbox

如果要在节点中使用checkbox,必须在各个treenode设置node.CheckBox = true,才能实现。下面的代码使用了一个递归函数实现对整个treeview所有节点的checkbox设置。

          private void SetCheckBox(TreeNode pNode)

         {

              if(pNode == null)

              {

                   foreach(TreeNode node in MessageTypeTree.Nodes)

                  {

                       node.CheckBox = true;

                       node.Expanded = true;

                       SetCheckBox(node);

                   }

              }

              else

              {

                   foreach(TreeNode node in pNode.Nodes)

                   {

                       node.CheckBox = true;

                       node.Expanded = true;

                       SetCheckBox(node);

                   }

              }

         }

4.     操作treeviewcheckbox

4.1.    功能点分析

总结一下,主要实现如下效果:

(1)    选择父节点时,子节点全部选上。

(2)    当子节点全部选上时,父节点应选上。

(3)    点击全选时,将所有的节点选上

(4)    点击反选时,将没有选中的节点选上,将已选中的节点清除,同时注意判断子节点没有全部选上时,父节点不能选上。

4.2.    实现思路

要操作checkbox,肯定要在客户端实现,大量使用js脚本是无法避免了。 2003中的treeview2005treeview实现机制有所不同,直接利用jsdocument.getElementByTag(“input”)的方法是不能获取到的,但天无绝人之路,好在treeview公开了所有的源码。客户端的源码在默认网站下"webctrl_client\1_0"中,安装时拷贝过去的。打开目录,找到名为treeview.htc的文件。服务器端的源码在安装目录下的Src目录中。

源码中的开头对treeview的公共方法和属性都作了一个定义,如下所示

treeview公共成员

可以直接通过treeview对象调用这些方法,主要用到的方法和属性如下表所示

名称

输入参数

返回值

描述

clickedNodeIndex

Null

索引值,例如1.0.1

获取当前点击的node索引值

getChildren

Null

节点数组

获取下一级的节点数组

getTreeNode

NodeIndex

TreeNode对象

根据索引获取树节点

 

除了treeview对象,涉及到的对象还有TreeNode对象,TreeNode对象主要用到的方法和属性如下表所示

名称

输入参数

返回值

描述

getAttribute

属性名称,如”text”

字符型,如test

获取当前节点的属性值

setAttribute

属性名称和值

Null

设置当前节点的属性值

getNodeIndex

Null

索引值

获取当前节点的索引值

getChildren

Null

节点数组

获取下一级的节点数组

getParent

Null

TreeNodeTree对象

获取父对象

       现在万事俱备,只欠东风。在服务器端,设置treeviewoncheck事件激发脚本代码,如下所示

MessageTypeTree.Attributes["oncheck"] = "javascript:SelectCheckBox();";

客户端实现如下所示

客户端实现代码

posted @ 2009-02-26 19:34  Yu Wang  阅读(686)  评论(0编辑  收藏  举报