天天无用

要用最简单的方法解决最实际的问题

刘强ID:luq885
40341次访问,排名2736(-1)好友5人,关注者18
太懒
luq885的文章
原创 18 篇
翻译 0 篇
转载 8 篇
评论 36 篇
天天无用的公告

本博客所有原创文章版权归本人所有,如欲转载或用于商业请先联系本人。

最近评论
eleph:我的是VS2003 该怎么办呀,刚试了一下,你的代码.在我这上面好像不行样.
xqxujun:好像不通用啊,,
鱼鱼:能不能加上自动选择搜索出来的第一个为默认值?
dmm_2008:你好呀..能发我个JSP的例子吗.


dongming_9431@163.com
sean_xxrs:在PHP里怎么实现啊?
文章分类
收藏
相册
链接
『 天道酬勤 』(RSS)
Dflying Chen(RSS)
听棠.NET(RSS)
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 asp.net 2.0 中 TreeView控件中的checkbox客户端操作收藏

新一篇: .net下两种json序列化速度比对(已添加源代码下载地址) | 旧一篇: asp.net2.0学习笔记:根据roles显示不同的sitemap

  最近有一个项目要做到用树形结构来控制权限, 要做到以下三条

  1. 当选择根节点时所有的子节点都要被选择
  2. 当选择子节点时相应的根节点也要被选择
  3. 当所有子节点取消选择时根节点也要取消选择。

  树形控件用的是asp.net 2.0自带的treeview控件,如何控制它的checkbox一点头绪也没有,google上找了找,发现这个问题还是比较普遍的,终于找了一篇文章http://itrust.cnblogs.com/archive/2006/04/03/365439.html,照上面做了一下,但是出错。仔细看了一下,发现回复中有一段代码可以使用,但是只能实现第一条,另外两条做不到。

  看了免费的午餐还是不好吃的,还是要自己动手,分析了一下这段代码,又结合上面的文章看了一下,把代码修改了一下,终于可以全部做到了。

  代码如下:

function OnTreeNodeChecked() 

    
var ele = event.srcElement; 
    
if(ele.type=='checkbox'
    

        
var childrenDivID = ele.id.replace('CheckBox','Nodes');
        
var div = document.getElementById(childrenDivID); 
        
if(div != null)
        
{
            
var checkBoxs = div.getElementsByTagName('INPUT'); 
            
for(var i=0;i<checkBoxs.length;i++
            

                
if(checkBoxs[i].type=='checkbox'
                checkBoxs[i].checked
=ele.checked; 
            }

        }

        
else
        
{
            
var div = GetParentByTagName(ele,'DIV');
            
var checkBoxs = div.getElementsByTagName('INPUT'); 
            
var parentCheckBoxID = div.id.replace('Nodes','CheckBox');
            
var parentCheckBox = document.getElementById(parentCheckBoxID);
            
for(var i=0;i<checkBoxs.length;i++
            
{
                
if(checkBoxs[i].type=='checkbox' && checkBoxs[i].checked)
                
{
                    parentCheckBox.checked 
= true;
                    
return;
                }

            }

            parentCheckBox.checked 
= false;
        }

        
    }
 
}


function GetParentByTagName(element, tagName) {
    
var parent = element.parentNode;
    
var upperTagName = tagName.toUpperCase();
    
while (parent && (parent.tagName.toUpperCase() != upperTagName)) {
        parent 
= parent.parentNode ? parent.parentNode : parent.parentElement;
    }

    
return parent;
}

  把上面一段存成treeview.js文件,在页面里引用,然后设置treeview控件的"onclick=OnTreeNodeChecked()",或者直接在Page_Load里加上“TreeView1.Attributes.Add("OnClick", "OnTreeNodeChecked()");”就可以了,留一个简单例子

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    
<title>无标题页</title>
    
<script language=javascript type="text/javascript" src=TreeView.js></script>
</head>
<body>
    
<form id="form1" runat="server">
        
<div>
            
<asp:TreeView ID="TreeView1" runat="server" ShowCheckBoxes="All" onclick="OnTreeNodeChecked()">
                
<Nodes>
                    
<asp:TreeNode SelectAction="Expand" Text="aaa" Value="aaa">
                        
<asp:TreeNode SelectAction="None" Text="a1" Value="a1"></asp:TreeNode>
                        
<asp:TreeNode SelectAction="None" Text="a2" Value="a2"></asp:TreeNode>
                    
</asp:TreeNode>
                    
<asp:TreeNode SelectAction="Expand" Text="bbb" Value="bbb">
                        
<asp:TreeNode SelectAction="None" Text="b1" Value="b1"></asp:TreeNode>
                        
<asp:TreeNode SelectAction="None" Text="b2" Value="b2"></asp:TreeNode>
                    
</asp:TreeNode>
                
</Nodes>
            
</asp:TreeView>
        
</div>
    
</form>
</body>
</html>

  另外js里的GetParentByTagName(element, tagName)函数是treeview中自带的,原先的函数 WebForm_GetParentByTagName(element, tagName) ,写在这里是为了让自己用的时候不糊涂,大家在使用的时候可以把js里“var div = GetParentByTagName(ele,'DIV');”这一行换成“var div = WebForm_GetParentByTagName(ele,'DIV');”然后去掉GetParentByTagName(element, tagName)函数,效果是一样的。

发表于 @ 2007年04月12日 00:02:00|评论(loading...)|编辑

新一篇: .net下两种json序列化速度比对(已添加源代码下载地址) | 旧一篇: asp.net2.0学习笔记:根据roles显示不同的sitemap

评论

#guest 发表于2007-06-14 15:45:21  IP: 221.237.70.*
有兼容性问题.

firefox里不行.

哈...修改一下应该就可以了.
#eleph 发表于2008-07-15 15:23:27  IP: 221.237.77.*
我的是VS2003 该怎么办呀,刚试了一下,你的代码.在我这上面好像不行样.
2008-07-16 13:35:16作者回复
我是用vs2005做的<br />vs2003好像没有自带treeview控件
发表评论  


登录
Csdn Blog version 3.1a
Copyright © 天天无用