转:asp.net TreeView CheckChanged 事件浅谈

http://blog.csdn.net/xiage/article/details/5128755

在开发中经常可以碰到类似的问题: 想通过一个树父节点的TreeNodeCheckChanged 事件( 前提是设置TreeView 的CheckBox可见), 来选择或反选择全部的子节点, 来实现自己的要实现的操作功能. 于是我们很正常的思维促使我们去寻找TreeView的的类似于 ” CheckChanged ” 的事件, 很容易我们找到了这个事件 ” TreeNodeCheckChanged ” . 我们很轻松并优雅的写着事件的实现代码, 心理很感谢微软, 丫的真实方便咱开发啊, 要啥有啥, 就差偷偷笑出来了(:-D).

正当我们在高兴头上呢, 我们发现当我们点击那个三角号运行页面的时候, 点击父节点子节点并没有被选中货反选. 还以为是鼠标问题呢. 于是再次的点击父节点, 还是没有我们想要的结果. 这是我们可能会刷新页面并再次的尝试, 结果还不是我们想要的样子.

用惯了现成的东西, 现在突然出了点意外, 很让人扫兴. 但是项目不能停呐, 于是乎我们开始分析代码, 检查数次后发现代码没问题. 我们开始google. 嗯, 找到了原因. 原来只有当页面submit 的时候才会提交更改, 这也是一个解决问题的方向.但是我们想在不提交页面的时候就更改变, 这个时候我们想到了通过javascript 来解决问题.

这是我们要进行操作的TreeView, 当我想点击一级节点的时候想把两个二级节点都选中. 如下图 .

从查看TreeView 的HTML 代码开始, 页面上生成的代码类似于下面( 代码太多我整理了一下):

一个TreeView 从一个锚点开始.

< a href ="#TreeView1_SkipLink">

< img alt =" 跳过导航链接。" width ="0" height ="0" style ="border-width: 0px;" /></ a >

然后是一个节点容器DIV( TreeView1 ), 所有的节点都放在这里.

< div id ="TreeView1" onclick="onTreeViewClick(event);" style ="font-size: 12px;">

树节点在HTML 用Table 标签来表示, 一个Node 节点就是一个表格Table. 所以下面名称为 ” 一级节点 ” 的表格是树的一个节点 .

< table cellpadding ="0" cellspacing ="0" style ="border-width: 0;">

< tr >

< td >

< a id ="TreeView1n0" href ="javascript:TreeView_ToggleNode( … )">

< img src =" … " alt =" 折叠一级节点" style ="border-width: 0;" /></ a ></ td>

< td >

< a href ="javascript:TreeView_ToggleNode( … )" id ="TreeView1t0i" tabindex ="-1">

< img src ="image/folderopen.gif" alt ="" style ="border-width: 0;" /></ a ></td >

< td class ="TreeView1_2" style ="white-space: nowrap;">

< input type ="checkbox" name ="TreeView1n0CheckBox" id ="TreeView1n0CheckBox" title ="一级节点" />

< a   id ="TreeView1t0"> 一级节点</ a ></ td >

</ tr >

</ table >

紧接着下面的是子节点( 如果有的话), 子节点是被DIV 包容着的. 我们看这个DIV 的ID, 前半部分 ” TreeView1n0 ” 和上面的父节点里面元素是不是有很多是相同的, 由此可以看出TreeView 的节点命名规则. 这点很重要下面就会用到 .

< div id ="TreeView1n0Nodes" style ="display: block;">

子节点 
        < table cellpadding ="0" cellspacing ="0" style ="border-width: 0;">

< tr >

< td >

< div style ="width: 20px; height: 1px">

</ div >

</ td >

< td >

< img src =" … " alt ="" /></ td >

< td >

< a onclick ="javascript:TreeView_SelectNode(TreeView1_Data, this,‘TreeView1t1‘);"

id ="TreeView1t1i" tabindex ="-1">

< img src ="image/file.gif" alt ="" style ="border-width: 0;" /></ a ></ td >

< td class ="TreeView1_2" style ="white-space: nowrap;">

< input type ="checkbox" name ="TreeView1n1CheckBox" id ="TreeView1n1CheckBox"title =" 二级节点" />

< a id ="TreeView1t1"> 二级节点1</ a ></ td >

</ tr >

</ table >

子节点 
         < table cellpadding ="0" cellspacing ="0" style ="border-width: 0;">

< tr >

< td >

< div style ="width: 20px; height: 1px">

</ div >

</ td >

< td >

< img src =" … " alt ="" /></ td >

< td >

< a onclick ="javascript:TreeView_SelectNode(...);" id ="TreeView1t2i" tabindex="-1">

< img src ="image/file.gif" alt ="" style ="border-width: 0;" /></ a ></ td >

< td class ="TreeView1_2" style ="white-space: nowrap;">

< input type ="checkbox" name ="TreeView1n2CheckBox" id ="TreeView1n2CheckBox"title =" 二级节点" />

< a id ="TreeView1t2"> 二级节点2</ a ></ td >

</ tr >

</ table >

</ div >

我们看到这里似乎明白了很多, 选中和反选中我们其实也可以通过对这些HTML 标签的操作来实现的( 其实我们知道TreeView 也是操作这些HTML 标签的, 它生成的脚本被我去掉了, 就是通过这些脚本来操作的).

首先要给TreeView 添加一个onclick 事件 onclick ="onTreeViewClick(event);" 如上面红色加粗代码的地方, 这是为了响应CheckChanged 事件.

我们定义一个对象来接收被我们点解触发的CheckBox, 这里我们为了考虑浏览器的兼容性, 所以多写点代码.

evt = evt || window.event ;

var obj = (evt.target) ? evt.target : evt.srcElement ;

evt 是作为参数传递进来的( 在Firefox 下适用).

这时的obj 还不确定是不是CheckBox, 所以我们加个判断

if (obj.tagName == "INPUT" && obj.type == "checkbox" ){

//...

}

这个时候obj 就是CheckBox 对象了, 我们继续往下看.

if (obj.tagName == "INPUT" && obj.type == "checkbox" )

{

//var node = obj.parentNode.parentNode.parentNode.parentNode.nextSibling;

//               TD         TR         TBODY      TABLE      DIV( 子节点的容器)

var node = document.getElementById(obj.id.replace("CheckBox" ,"Nodes" ));

var nodes ;

if (node){

nodes = node.getElementsByTagName("INPUT" );

for (var j = 0 ;j<nodes.length ; j++){

if (nodes[j].type == "checkbox" ){

nodes[j].checked = obj.checked;

}

}

}

}

来看这句

var node = document.getElementById(obj.id.replace("CheckBox" ,"Nodes" ));

这条代码就是获取当前节点的子节点的容器 , 我们上面分析的时候提到的

< div id ="TreeView1n0Nodes" style ="display: block;">, 这个容器的 ID 和当前 CheckBox 的 ID 的区别就是后面的”Nodes” 和 ”CheckBox”, 根据这个规律我们可以进行上面的操作 . 然后我们就可以找出这个 DIV 里面所有的CheckBox 了 : getElementsByTagName("INPUT" ), 然后就是选中货饭选中所有的CheckBox.

大家注意到上面还有一条被注释掉的代码 , 这句代码和上面分析的获取子节点的可以说是异曲同工 , 我第一次最直接想到的就是这个方法 . 各个 parentNode 的代表的元素我都在下面表出来的 .

下面把整个方法给出来 .

function onTreeViewClick(evt)

{

evt = evt || window.event ;

var obj = (evt.target) ? evt.target : evt.srcElement ;

if (obj.tagName == "INPUT" && obj.type == "checkbox" )

{

//var node = obj.parentNode.parentNode.parentNode.parentNode.nextSibling;

//               TD         TR         TBODY      TABLE      DIV( 子节点的容器)

alert(obj.parentNode.parentNode.parentNode.tagName);

var node = document.getElementById(obj.id.replace("CheckBox" ,"Nodes" ));

var nodes ;

if (node){

nodes = node.getElementsByTagName("INPUT" );

for (var j = 0 ;j<nodes.length ; j++){

if (nodes[j].type == "checkbox" ){

nodes[j].checked = obj.checked;

}

}

}

}

}

好了 , 这样就基本上满足了我们的需求 .

时间: 2024-10-11 22:22:16

转:asp.net TreeView CheckChanged 事件浅谈的相关文章

C#控件中的KeyDown、KeyPress 与 KeyUp事件浅谈

C#控件中的KeyDown.KeyPress 与 KeyUp事件浅谈 研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的定义 4.KeyDown.KeyUp 和KeyPress 之间的区别 5.如何区分是否按的是小键盘? 6.PrScrn按键三个事件能够捕获吗? 7.{菜单键}和{开始键}KeyPress能够捕获吗? 8.如何捕获系统的组合键? 9

【ASP.NET MVC系列】浅谈ASP.NET MVC资源过滤和授权

最近比较忙,博客很久没更新了,很多博友问何时更新博文,因此,今天就花了点时间,写了本篇文章,但愿大家喜欢. 本篇文章不适合初学者,需要对ASP.NET MVC具有一定基础. 本篇文章主要从ASP.NET MVC 基架角度去分析MVC框架是如何实现资源过滤,资源授权,感兴趣的,欢迎阅读. 相关文章,请参与ASP.NET MVC系列 一 ASP.NET MVC框架验证机制 为了更加透彻地了解MVC的过滤机制,我简要地画了如下UML图. 下面,我们根据如上的UML图来简要分析一下. (一)MVC基架过

【转】【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式

ASP.NET MVC系列文章 原文地址:https://www.cnblogs.com/wangjiming/p/6275854.html [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作篇)(下) [04]浅谈ASP.NET框架 [05]浅谈ASP.NET MVC运行过程 [06]浅谈ASP.NET MVC 控制器 [07]浅谈ASP.NET MVC 路由 [08]浅谈AS

心情笔记——从一次黑客攻击事件浅谈运维技术学习

昨天分享了一篇文章,是关于如何搭建Openvpn服务器实现免流上网,由于文章中的内容使用的是自己真实的服务器环境,文章分享出去以后得到了很多的浏览与搭建细节的咨询,但同时IP地址也遭到了泄露.随后就迎来了一轮又一轮的DDOS攻击,还好使用的并不是特大流量攻击,而且每次的攻击都是很短的时间,直到DDOS封堵后还继续有DDOS的攻击. 以前只接触过网络安全类问题,但并没有真正遇到过.这次的攻击事故给我提了个醒.如今的网络安全环境形式很复杂.身在学校的我们还没有真正接触到真实的生产环境,平时自己搭建的

【ASP.NET MVC系列】浅谈MVC

描述 本篇文章主要概述ASP.NET MVC,具体包括如下内容: 1.MVC模式概述 2.WebForm概述 3.WebForm与MVC区别 4.ASP.NET MVC发展历程 5.运用程序结构 6.ASP.NET MVC 默认约定 一 MVC模式概述 1. MVC模式运用领域 分析: (1)当前,MVC作为一种主流框架,被广泛运用,如JAVA Web开发,.NET ASP,NET MVC (2)MVC模式被广泛运用于中间件,如RabbitMQ; (3)MVC模式广泛运用于接口开发,如ASP.N

ASP.NET中Session的个人浅谈

看到博客园的一个哥们写的面试经历,想到了面试中常问到的Session,一时手痒就谈下自己对Session的理解,这东西最开始在用户登录登出的时候用到过,后来一直没怎么用过,里面还是有很多知识点值得注意的.先简单的说下吧,Session是分为客户端Session和服务端Session: 客户端Session Session称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息,当用户首次与Web服务器建立连接的时候,服务器会给当前访问用户分发一个 SessionID作为标

浅谈asp.net通过本机cookie仿百度(google)实现搜索input框自动弹出搜索提示

对于通过用户输入关键词实现自动弹出相关搜索结果,这里本人给两种解决方案,用于两种不同的情形. 常见方法是在数据库里建一个用户搜索关系表,然后通过用户搜索框输入的关键字异步调用数据表中的相关数据,显示在一个隐藏div中. 第二种方式也就是我现在着重讨论的方式,适用于单个用户,基于此用户以往的搜索数据来实现搜索提示功能.技术关键是记录下用户的以往搜索数据,写入cookie,然后页面从用户本机cookie调用数据. ok,下面进入正题.本文主要讲实现步骤,代码可根据自己实际需要更改. 一,如何写入co

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对