ComponentArtTreeView树型控件父子联动实现(CheckBox全选)
作者:相依相伴一起慢慢变老 | 来源:互联网 | 2023-08-19 18:03
最近在一个项目里面用到了ComponentArt中的TreeView,一个字“强”但后面遇到一个问题,就是当节点有子节点的时候,甚至子节
最近在一个项目里面用到了 ComponentArt 中的 TreeView ,一个字 “强”
但后面遇到一个问题, 就是当节点有子节点的时候,甚至子节点又有子节点的时候,节点的 CheckBox 联动问题。
很多情况下,当选择一个节点的时候,需要将节点下面的所有子节点全选,相应的,当取消的时候,也要将节点下面的子节点全部取消选择。而在有的时候选择一个节点,需要将节点的父节点选中,不是吗。
遗憾的是 ComponentArt TreeView 没有提供该功能,汗!!! 相信有好多朋友也曾碰到过这样的问题吧,
唉!人们都说人无完人,更别说控件了,ComponentArt TreeView 在我看来还是比较优秀的,还好,自己还懂点JS,把控件生成的JS 拷出来看了下,,原来问题还是好解决的。
少说话,多做事,废话说得太多了,共享一下我的解决方法,希望对大家有所帮助。
直接将以下JS代码放如页面即可
1
2
window.attachEvent(
"
onload
"
,
function
()
3
{
4 window.ComponentArt_HandleCheck=function(qzAiy, postbackId, storageIndex)
5 {
6 var qzm = qze.qzo(storageIndex);
7 var treeDiv=eval(qzm.ParentTreeView.ControlId.replace(/\$/g,"_")+"_div");
8 qzm.Checked = qzAiy.checked;
9 qzm.SaveState();
10 if(qze.ClientSideOnNodeCheckChanged)
11 {
12 qzm.ResolveAncestors();
13 qze.ClientSideOnNodeCheckChanged(qzm);
14 }
15 ;
16 if(qzm.AutoPostBackOnCheckChanged)
17 {
18 __doPostBack(qze.ControlId, 'CHECK ' + qzm.PostBackID + ' ' + qzm.Checked);
19 return;
20 }
21
22 if(qzAiy.checked==true)
23 {
24 CheckParentNode(treeDiv,qzm,qzAiy.checked)
25 }
26 qzm.ExpandAll();
27 qzm.Expand();
28 CheckChildNode(treeDiv,qzm,qzAiy.checked);
29 }
30}
)
31
32
function
CheckParentNode(treeDiv,node,value)
33
{
34 if(node!=null)
35 {
36 var pNode=node.GetParentNode()
37 if(pNode!=null)
38 {
39 try
40 {
41 treeDiv.all("checker_p"+pNode.StorageIndex.toString(16).toUpperCase()).checked=value;
42 }catch(e){}
43 pNode.Checked=value;
44 pNode.SaveState()
45 CheckParentNode(treeDiv,pNode,value);
46 }
47 }
48}
49
50
function
CheckChildNode(treeDiv,node,value)
51
{
52 var nodes=node.Nodes();
53 for(var i=0;i<nodes.length;i++)
54 {
55 try
56 {
57 treeDiv.all("checker_p"+nodes[i].StorageIndex.toString(16).toUpperCase()).checked=value;
58 }catch(e){}
59 nodes[i].Checked=value;
60 nodes[i].SaveState();
61 CheckChildNode(treeDiv,nodes[i],value);
62 }
63}
64
以上是针对 ComponentArt Web.UI 2.1.2171.30367 版本,而另一个版本ComponentArt Web.UI 2006.2.1477.1代码如下
1
2
function
ArtCheckAll()
3
{
4 ComponentArt_TreeViewNode.prototype.SetProperty = function(qztk, value, bSaveData,isEventFire)
5 {
6 var bSet = false;
7 for(var qzba = 0; qzba < this.Data.length; qzba ++ )
8 {
9 if(this.Data[qzba][0] == qztk)
10 {
11 this.Data[qzba][1] = value;
12 bSet = true;
13 break;
14 }
15 }
16
17 if( ! bSet)
18 {
19 this.Data[this.Data.length] = [qztk, value];
20 }
21
22 this[qztk] = value;
23 if(qztk=="Checked" && isEventFire!=true && event && event.srcElement.tagName=="INPUT" && event.srcElement.type=="checkbox")
24 {
25 var needRefresh=SaveCheckedChildNodes(this,value)
26 if(value)
27 {
28 needRefresh=needRefresh || CheckParentNode(this,value)
29 }
30
31 if(needRefresh)
32 {
33 this.ExpandAll();
34 this.Expand();
35 }
36 }
37 }
38
39 function SaveCheckedChildNodes(parentNode,value)
40 {
41 var r=false;
42 var nodes=parentNode.Nodes();
43 for(var i=0;i<nodes.length;i++)
44 {
45 if(nodes[i].Checked!=value)
46 {
47 r=true;
48 nodes[i].Checked=value;
49 nodes[i].SetProperty("Checked",value,true,true)
50 }
51 SaveCheckedChildNodes(nodes[i],value);
52 }
53 return r;
54 }
55
56 function CheckParentNode(node,value)
57 {
58 var r=false;
59 if(node!=null)
60 {
61 var pNode=node.GetParentNode()
62 if(pNode!=null)
63 {
64 if(pNode.Checked!=value)
65 {
66 r=true;
67 pNode.Checked=value;
68 pNode.SetProperty("Checked",value,true,true)
69 }
70 CheckParentNode(pNode,value);
71 }
72 }
73 return r;
74 }
75}
76
77
window.attachEvent(
"
onload
"
,ArtCheckAll)
以上方法,只对IE适用
欢迎访问
http://www.cnblogs.com/kuiyouli