总结这次的工作,明白了几个关键的地方:
1.JavaScript中的确可以直接引用.Net服务器端控件,但是问题在于,控件的ID在编译后会自动加上名字空间,所以这里要特别注意。
2.使用JavaScript可以使对TreeView的操作不需要再PostBack,十分方便有效。
3.空间状态的显示和实际存储是有区别的,一定要十分注意。
需要在C#文件中加入:
TreeView.Attributes.Add(
"
oncheck
"
,
"
tree_oncheck()
"
);
主要的JavaScript代码如下:
<
script language
=
"
javascript
"
>
<!--
function tree_oncheck()
{
var node = TreeView.getTreeNode(event.treeNodeIndex);
var Pchecked = node.getAttribute( " checked " );
setcheck(node, Pchecked);
TreeView.queueEvent('oncheck', node.getNodeIndex());
}
function setcheck(node, Pc)
{
var ChildNode = new Array();
ChildNode = node.getChildren();
if (parseInt(ChildNode.length) != 0 )
{
for ( var i = 0 ; i < ChildNode.length; i ++ )
{
var cNode = ChildNode[i];
if (cNode.getAttribute( " checked " ) != Pc)
{
if (parseInt(cNode.getChildren().length) != 0 )
setcheck(cNode, Pc);
cNode.setAttribute( " checked " , Pc);
TreeView.queueEvent('oncheck', cNode.getNodeIndex());
}
}
}
}
// -->
</ script >
<!--
function tree_oncheck()
{
var node = TreeView.getTreeNode(event.treeNodeIndex);
var Pchecked = node.getAttribute( " checked " );
setcheck(node, Pchecked);
TreeView.queueEvent('oncheck', node.getNodeIndex());
}
function setcheck(node, Pc)
{
var ChildNode = new Array();
ChildNode = node.getChildren();
if (parseInt(ChildNode.length) != 0 )
{
for ( var i = 0 ; i < ChildNode.length; i ++ )
{
var cNode = ChildNode[i];
if (cNode.getAttribute( " checked " ) != Pc)
{
if (parseInt(cNode.getChildren().length) != 0 )
setcheck(cNode, Pc);
cNode.setAttribute( " checked " , Pc);
TreeView.queueEvent('oncheck', cNode.getNodeIndex());
}
}
}
}
// -->
</ script >
整个功能的实现需要修改微软treeview控件的一个Bug
需要修改inetpub/wwwroot/webctrl_client/1_0/treeview.htc。
把function doCheckboxClick(el)中的第一行,
el.checked = !el.checked;
改成:
el.checked = !el.getAttribute("checked");