ComponentArt TreeView 树型控件父子联动实现 (CheckBox 全选)

         最近在一个项目里面用到了 ComponentArt 中的 TreeView ,一个字 “强”  
         但后面遇到一个问题,   就是当节点有子节点的时候,甚至子节点又有子节点的时候,节点的 CheckBox 联动问题。
         很多情况下,当选择一个节点的时候,需要将节点下面的所有子节点全选,相应的,当取消的时候,也要将节点下面的子节点全部取消选择。而在有的时候选择一个节点,需要将节点的父节点选中,不是吗。
         遗憾的是 ComponentArt TreeView 没有提供该功能,汗!!! 相信有好多朋友也曾碰到过这样的问题吧,
         唉!人们都说人无完人,更别说控件了,ComponentArt TreeView 在我看来还是比较优秀的,还好,自己还懂点JS,把控件生成的JS 拷出来看了下,,原来问题还是好解决的。
         少说话,多做事,废话说得太多了,共享一下我的解决方法,希望对大家有所帮助。
         直接将以下JS代码放如页面即可

 1
 2 window.attachEvent( " onload " , function ()
 3 ExpandedBlockStart.gifContractedBlock.gif {
 4    window.ComponentArt_HandleCheck=function(qzAiy, postbackId, storageIndex)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 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)
11ExpandedSubBlockStart.gifContractedSubBlock.gif        {
12            qzm.ResolveAncestors();
13            qze.ClientSideOnNodeCheckChanged(qzm);
14        }

15        ;
16        if(qzm.AutoPostBackOnCheckChanged)
17ExpandedSubBlockStart.gifContractedSubBlock.gif        {
18            __doPostBack(qze.ControlId, 'CHECK ' + qzm.PostBackID + ' ' + qzm.Checked);
19            return;
20        }

21        
22        if(qzAiy.checked==true)
23ExpandedSubBlockStart.gifContractedSubBlock.gif        {
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 ExpandedBlockStart.gifContractedBlock.gif {
34    if(node!=null)
35ExpandedSubBlockStart.gifContractedSubBlock.gif    {
36        var pNode=node.GetParentNode()
37        if(pNode!=null)
38ExpandedSubBlockStart.gifContractedSubBlock.gif        {
39            try
40ExpandedSubBlockStart.gifContractedSubBlock.gif            {
41                treeDiv.all("checker_p"+pNode.StorageIndex.toString(16).toUpperCase()).checked=value;
42ExpandedSubBlockStart.gifContractedSubBlock.gif            }
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 ExpandedBlockStart.gifContractedBlock.gif {
52    var nodes=node.Nodes();
53    for(var i=0;i<nodes.length;i++)
54ExpandedSubBlockStart.gifContractedSubBlock.gif    {
55        try
56ExpandedSubBlockStart.gifContractedSubBlock.gif        {
57            treeDiv.all("checker_p"+nodes[i].StorageIndex.toString(16).toUpperCase()).checked=value;
58ExpandedSubBlockStart.gifContractedSubBlock.gif        }
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 ExpandedBlockStart.gifContractedBlock.gif {
 4    ComponentArt_TreeViewNode.prototype.SetProperty = function(qztk, value, bSaveData,isEventFire)
 5ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 6       var bSet = false;
 7       for(var qzba = 0; qzba < this.Data.length; qzba ++ )
 8ExpandedSubBlockStart.gifContractedSubBlock.gif       {
 9          if(this.Data[qzba][0== qztk)
10ExpandedSubBlockStart.gifContractedSubBlock.gif          {
11             this.Data[qzba][1= value;
12             bSet = true;
13             break;
14          }

15       }

16
17       if! bSet)
18ExpandedSubBlockStart.gifContractedSubBlock.gif       {
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")
24ExpandedSubBlockStart.gifContractedSubBlock.gif       {
25            var needRefresh=SaveCheckedChildNodes(this,value)
26               if(value)
27ExpandedSubBlockStart.gifContractedSubBlock.gif               {
28                   needRefresh=needRefresh || CheckParentNode(this,value)
29               }

30               
31               if(needRefresh)
32ExpandedSubBlockStart.gifContractedSubBlock.gif               {
33                   this.ExpandAll();
34                this.Expand();
35            }

36        }

37    }

38    
39    function SaveCheckedChildNodes(parentNode,value)
40ExpandedSubBlockStart.gifContractedSubBlock.gif    {
41        var r=false;
42        var nodes=parentNode.Nodes();
43        for(var i=0;i<nodes.length;i++)
44ExpandedSubBlockStart.gifContractedSubBlock.gif        {
45            if(nodes[i].Checked!=value)
46ExpandedSubBlockStart.gifContractedSubBlock.gif            {
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)
57ExpandedSubBlockStart.gifContractedSubBlock.gif    {
58        var r=false;
59        if(node!=null)
60ExpandedSubBlockStart.gifContractedSubBlock.gif        {
61            var pNode=node.GetParentNode()
62            if(pNode!=null)
63ExpandedSubBlockStart.gifContractedSubBlock.gif            {
64                if(pNode.Checked!=value)
65ExpandedSubBlockStart.gifContractedSubBlock.gif                {
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

转载于:https://www.cnblogs.com/kuiyouli/archive/2007/06/28/799308.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值