JS TreeView的Checkbox级联操作

简介:

1         前言

.Net  Web 应用 有一个很大的苦恼就是没有太趁手的 TreeView 可用。微软的 TreeView 仅用作数据显示还行,但服务器控件不停的刷新太影响客户体验。商业化的 TreeView obout treeview / FlyTreeView / Infragistics NetAdvantage Treeview )都不错,特别是 obout treeview 短小精干讨人喜欢,但许可证是一个大障碍(公司一般不会花钱买的)。我一般而言,在 TreeView 做事情,用 checkbox 的时候较多,特别是父子节点的关联,因此,对 Microsoft TreeView 改造就从父子节点的关联开始。

2         ASP.Net 2.0 Treeview 简要分析

ASP.Net 2.0 Treeview 吹的很不错,但客户端操作几乎为零。微软实现了一些客户端用的 . TreeView.js ,还不公开,藏在 system.web.dll 中,以资源的方式通过 WebResource.axd 来向客户端释放。仔细分析一下 TreeView.js ,会发现微软为 TreeView 自动生成的 Html 脚本结构如下:
<div>          //
      <table/> // 节点
      <div/>   // 节点的子节点,里面的内容是一个或多个 <table/><div/>
</div>
因此,准确的说是 <table/><div/> 构成一个节点,但很难明确的在 DOM 中确定一个节点,原因如下:
1.         ID Name 是顺序排列的,命名规则如下:  ID + “n” +  节点序号,例如  MyTreen0
商业的 TreeView 一般在 ID 中包含层次信息,如 : MyTreeNode1_1_2  表示树的1.1.2 那个节点,分析起来很容易
2.         上面描述的节点命名的 ID ,是分配给 <table/> 里的 <A/> 也就是显示  加号  减号的那个链接元素,由于该元素在 <table/> 中,因此给分析带来了难度
3.         叶子节点没有上面所描述的 <table/> 里的那个 <A/>   无法分析(因此我自己 . 才会里出现 A 节点和 Input 节点, A 节点就是有“树 ID + “n” +  节点序号”为 ID 的链接元素, Input 节点是 <table/> 里的 Checkbox ,命名规则为:  ID + “n” +  节点序号  + “CheckBox”

没办法,只有自己写JS函数来处理CheckBox的级联操作,其中用到了微软的TreeView.js  WebForm.js,下载链接: TreeView2.rar

  加入方法如下:
*        TreeView 加入 OnClick 事件
直接在 TreeView的属性上加入: OnClick="OnTreeNodeChecked()"
或者: MyTree.Attributes.Add("OnClick""OnTreeNodeChecked(event)");
*        这样写 OnClick 事件动作
< . language  = . type = " text/. " >  
    
function  OnTreeNodeChecked() 
    

        
var element = window.event.srcElement; 
        
if (!IsCheckBox(element)) 
            
return

        
var isChecked = element.checked; 
        
var tree = TV2_GetTreeById(<%=SubSysTree.ClientID%>); 
        
var node = TV2_GetNode(tree,element); 

        TV2_SetChildNodesCheckStatus(node,isChecked); 

        
var parent = TV2_GetParentNode(tree,node); 
        TV2_NodeOnChildNodeCheckedChanged(tree,parent,isChecked); 

    }
 
< / .> 
 
 
这里是引用了一个外部js文件,如果只是要简单的选择父节点,同时下面子节点全部都全中,其实很简单,下面是我自己摘出来的一段代码。
function setChildrenNodesCheck()
    {
        var element = window.event.srcElement; 
        if(element.tagName=="INPUT")
        {
            var id=element.id.toLowerCase().replace("checkbox","");
            id+="Nodes";
            var objDivId=document.getElementById(id);//element.getElementsByTagName("input");
            var childrenTags= WebForm_GetElementsByTagName(objDivId,"input");
            if(childrenTags!=null)
            {
                for(i=0;i<childrenTags.length;i++)
                {
                    childrenTags[i].checked=element.checked;
                }
             }
        }
    }
就像上文所说的,所有节点的子节点都包含在一个div中,该div的名字和父节点<table>中的名字是前部分相同,只是后部分不同,一个是checkbox一个是nodes,大家可以跟代码看一下。然后找到div之后,就可以用WebForm_GetElementsByTagName,找到所有的子孩子,然后就控制他的选择状态就可以了。WebForm_GetElementsByTagName是微软提供的函数,是根据标签从当前元素下找elements

本文转自lidup 51CTO博客,原文链接:http://blog.51cto.com/lidup/136817,如需转载请自行联系原作者


相关文章
|
10月前
|
JavaScript
js 选取table中checkbox选中行的某一列
js 选取table中checkbox选中行的某一列
69 0
|
前端开发 JavaScript
前端:js根据CheckBox获得选中行的具体某些列内容(批量操作传多条数据)
前端:js根据CheckBox获得选中行的具体某些列内容(批量操作传多条数据)
141 0
|
JavaScript 前端开发
使用js操作checkbox
我们在项目中经常会遇到这个问题:使用js判断checkbox框是否被选中以及使用js对checkbox进行操作。 其实这些需求很简单,这里给出使用原生js和jQuery来完成这些需求。
1179 0
|
JavaScript 前端开发 数据安全/隐私保护
js之checkbox判断常用示例
checkbox常用示例可参考: 关于checkbox自动选中 checkbox选中并通过ajax传数组到后台接收 MP实战系列(十三)之批量修改操作(前后台异步交互) 本次说的是,还是关于智能门锁开锁方式。
1283 0
|
JavaScript 前端开发