總結這次的工作,明白了幾個關鍵的地方:
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>
整個功能的實現需要修改微軟treeview控制項的一個Bug
需要修改inetpub\wwwroot\webctrl_client\1_0\treeview.htc。
把function doCheckboxClick(el)中的第一行,
el.checked = !el.checked;
改成:
el.checked = !el.getAttribute("checked");
博主註:這篇文章講到的方法經本人試用會出錯,較完善的解決方案見 TreeView父子聯動效果保持節點狀態一致