扩展TreeView控件(1) - 联动复选框(复选框的全选和取消全选)
//----------------------------
// http://webabcd.cnblogs.com/
//----------------------------

/**//*Helper 开始*/
String.prototype.yy_stv_startsWith =

{
/// <summary>StartsWith()</summary>
var reg =
return reg.test(this);
}
function yy_stv_addEvent(obj, evtType, fn) 

{
/// <summary>绑定事件</summary>
// FF

{
obj.addEventListener(evtType, fn, true);
return
}
// IE

{
var r = obj.attachEvent("on"
return r;
}
else
{
return
}
}
/**//*Helper 结束*/


/**//*联动复选框 开始*/
var yy_stv_ccTreeView_pre =
function yy_stv_ccClickCheckbox(e) 

{
/// <summary>单击复选框时</summary>
var evt = e || window.event; // FF || IE
yy_stv_foreachChildCheckbox(obj);
yy_stv_foreachParentCheckbox(obj);
}

function yy_stv_checkParentCheckbox(table, checked)

{
/// <summary>设置父复选框的状态</summary>
var nodes = table.parentNode.parentNode.childNodes;
for (var i=1; i<nodes.length; i++)
{
if (nodes == table.parentNode)
{
if (typeof(nodes[i-1]) == 'undefined' ||
for (var j=0; j < nodes[i-1].rows[0].cells.length; j++)
{
var chk = nodes[i-1].rows[0].cells[j].childNodes[0];
if (chk.tagName ==
{
chk.checked = checked;
yy_stv_foreachParentCheckbox(nodes[i-1]);
return;
}
}
}
}
}
function yy_stv_foreachChildCheckbox(obj)

{
/// <summary>单击父复选框时,设置其子复选框的选中状态</summary>
var checked;
if (obj.tagName ==
{
checked = obj.checked;
do
{
obj = obj.parentNode;
}
while (obj.tagName !=
}
var nodes = obj.parentNode.childNodes;
for (var i=0; i<nodes.length -
{
if (nodes == obj && nodes[i +
{
var elements = nodes[i+1].getElementsByTagName("INPUT");
for (j=0; j< elements.length; j++) 
{
if (elements[j].type == 'checkbox') 
{
elements[j].checked = checked;
}
}
}
}
}
function yy_stv_foreachParentCheckbox(obj)

{
/// <summary>单击某一复选框时,设置其父复选框的选中状态</summary>
var checkedNum =
var uncheckedNum =
if (obj.tagName ==
{
do
{
obj = obj.parentNode;
}
while (obj.tagName !=
}
var tables = obj.parentNode.getElementsByTagName("TABLE");
if (typeof(tables) == 'undefined') return;
for (var i=0; i < tables.length; i++)
{
for (var j=0; j < tables.rows[0].cells.length; j++)
{
var chk = tables.rows[0].cells[j].childNodes[0];
if (chk.tagName ==
{
if (chk.checked)
checkedNum ++;
else
uncheckedNum ++;
}
}
}
if (uncheckedNum ==
{
yy_stv_checkParentCheckbox(obj, true);
}
else
{
yy_stv_checkParentCheckbox(obj, false);
}
}

function yy_stv_attachCheckboxClickListener()

{
/// <summary>监听所有联动复选框的单击事件</summary>
var elements = document.getElementsByTagName("INPUT");
for (i=0; i< elements.length; i++) 
{
if (elements.type == 'checkbox') 
{
for (j=0; j<yy_stv_ccTreeView_pre.length; j++)
{
if (elements.id.yy_stv_startsWith(yy_stv_ccTreeView_pre[j]))
{
yy_stv_addEvent(elements, 'click', yy_stv_ccClickCheckbox);
break;
}
}
}
}
}
if (document.all)

{
window.attachEvent('onload', yy_stv_attachCheckboxClickListener);
}
else

{
window.addEventListener('load', yy_stv_attachCheckboxClickListener, false);
}
/**//*联动复选框 结束*/
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.Web.UI;
namespace YYControls

{
/**////
/// SmartTreeView类的属性部分
///

{
private
/**////
/// 是否启用联动复选框功能
///
[
Browsable(true),
Description("是否启用联动复选框功能"),
Category("扩展"),
DefaultValue(false)
]
public
{
get
{ return _allowCascadeCheckbox; }
set
{ _allowCascadeCheckbox = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
using System.Web.UI;
namespace YYControls.SmartTreeViewFunction

{
/**////
/// 扩展功能:联动复选框
///

{
/**////
/// 构造函数
///
: base()
{
}

/**////
/// 构造函数
///
///
: base(stv)
{
}

/**////
/// 扩展功能的实现
///

{
this._stv.PreRender +=
}

/**////
/// SmartTreeView的PreRender事件
///
///
///

{
// 注册向数组中添加成员的脚本

{
this._stv.Page.ClientScript.RegisterClientScriptBlock
(
this.GetType(),
String.Format("yy_stv_cascadeCheckbox_{0}", this._stv.ID),
String.Format("yy_stv_ccTreeView_pre.push('{0}');", Helper.Common.GetChildControlPrefix(this._stv)),
true
);
}
}
}
}