难道是BUG?为什么ASP.NET2.0下的TreeView中的checkbox无法PostBack和自动关联!
最近作项目正在使用TreeView,发现了ASP.NET2.0下的TreeView中的checkbox无法PostBack和自动关联,难道又是微软的一个难道是BUG?不过这个BUG也有点太大了阿,查遍了网上的资料,发现有人用JS解决了这个问题,经过调试,已经解决了这个问题,但总感觉不是很完美,呵呵。
假设有如下三条规则:
1、该节点可以访问,则它的父节点也必能访问;
2、该节点可以访问,则它的子节点也都能访问;
3、该节点不可访问,则它的子节点也不能访问。
假设有如下三条规则:
1、该节点可以访问,则它的父节点也必能访问;
2、该节点可以访问,则它的子节点也都能访问;
3、该节点不可访问,则它的子节点也不能访问。
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 this.TreeView1.Attributes.Add("onclick", "CheckEvent()");
4 }
2 {
3 this.TreeView1.Attributes.Add("onclick", "CheckEvent()");
4 }
1 //获取元素指定tagName的父元素
2 function public_GetParentByTagName(element, tagName)
3 {
4 var parent = element.parentNode;
5 var upperTagName = tagName.toUpperCase();
6 //如果这个元素还不是想要的tag就继续上溯
7 while (parent && (parent.tagName.toUpperCase() != upperTagName))
8 {
9 parent = parent.parentNode ? parent.parentNode : parent.parentElement;
10 }
11 return parent;
12 }
13
14 //设置节点的父节点Cheched——该节点可访问,则它的父节点也必能访问
15 function setParentChecked(objNode)
16 {
17 var objParentDiv = public_GetParentByTagName(objNode,"div");
18 if(objParentDiv==null || objParentDiv == "undefined")
19 {
20 return;
21 }
22 var objID = objParentDiv.getAttribute("ID");
23 objID = objID.substring(0,objID.indexOf("Nodes"));
24 objID = objID+"CheckBox";
25 var objParentCheckBox = document.getElementById(objID);
26 if(objParentCheckBox==null || objParentCheckBox == "undefined")
27 {
28 return;
29 }
30 if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "checkbox")
31 return;
32 objParentCheckBox.checked = true;
33 setParentChecked(objParentCheckBox);
34 }
35
36 //设置节点的子节点uncheched——该节点不可访问,则它的子节点也不能访问
37 function setChildUnChecked(divID)
38 {
39 var objchild = divID.children;
40 var count = objchild.length;
41 for(var i=0;i<objchild.length;i++)
42 {
43 var tempObj = objchild[i];
44 if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
45 {
46 tempObj.checked = false;
47 }
48 setChildUnChecked(tempObj);
49 }
50 }
51
52 //设置节点的子节点cheched——该节点可以访问,则它的子节点也都能访问
53 function setChildChecked(divID)
54 {
55 var objchild = divID.children;
56 var count = objchild.length;
57 for(var i=0;i<objchild.length;i++)
58 {
59 var tempObj = objchild[i];
60 if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
61 {
62 tempObj.checked = true;
63 }
64 setChildChecked(tempObj);
65 }
66 }
67
68 //触发事件
69 function CheckEvent()
70 {
71
72 var objNode = event.srcElement;
73
74 if(objNode.tagName!="INPUT" || objNode.type!="checkbox")
75 return;
76
77 if(objNode.checked==true)
78 {
79 setParentChecked(objNode);
80 var objID = objNode.getAttribute("ID");
81 var objID = objID.substring(0,objID.indexOf("CheckBox"));
82 var objParentDiv = document.getElementById(objID+"Nodes");
83 if(objParentDiv==null || objParentDiv == "undefined")
84 {
85 return;
86 }
87 setChildChecked(objParentDiv);
88 }
89 else
90 {
91 var objID = objNode.getAttribute("ID");
92 var objID = objID.substring(0,objID.indexOf("CheckBox"));
93 var objParentDiv = document.getElementById(objID+"Nodes");
94 if(objParentDiv==null || objParentDiv == "undefined")
95 {
96 return;
97 }
98 setChildUnChecked(objParentDiv);
99 }
100 }
101
2 function public_GetParentByTagName(element, tagName)
3 {
4 var parent = element.parentNode;
5 var upperTagName = tagName.toUpperCase();
6 //如果这个元素还不是想要的tag就继续上溯
7 while (parent && (parent.tagName.toUpperCase() != upperTagName))
8 {
9 parent = parent.parentNode ? parent.parentNode : parent.parentElement;
10 }
11 return parent;
12 }
13
14 //设置节点的父节点Cheched——该节点可访问,则它的父节点也必能访问
15 function setParentChecked(objNode)
16 {
17 var objParentDiv = public_GetParentByTagName(objNode,"div");
18 if(objParentDiv==null || objParentDiv == "undefined")
19 {
20 return;
21 }
22 var objID = objParentDiv.getAttribute("ID");
23 objID = objID.substring(0,objID.indexOf("Nodes"));
24 objID = objID+"CheckBox";
25 var objParentCheckBox = document.getElementById(objID);
26 if(objParentCheckBox==null || objParentCheckBox == "undefined")
27 {
28 return;
29 }
30 if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "checkbox")
31 return;
32 objParentCheckBox.checked = true;
33 setParentChecked(objParentCheckBox);
34 }
35
36 //设置节点的子节点uncheched——该节点不可访问,则它的子节点也不能访问
37 function setChildUnChecked(divID)
38 {
39 var objchild = divID.children;
40 var count = objchild.length;
41 for(var i=0;i<objchild.length;i++)
42 {
43 var tempObj = objchild[i];
44 if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
45 {
46 tempObj.checked = false;
47 }
48 setChildUnChecked(tempObj);
49 }
50 }
51
52 //设置节点的子节点cheched——该节点可以访问,则它的子节点也都能访问
53 function setChildChecked(divID)
54 {
55 var objchild = divID.children;
56 var count = objchild.length;
57 for(var i=0;i<objchild.length;i++)
58 {
59 var tempObj = objchild[i];
60 if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
61 {
62 tempObj.checked = true;
63 }
64 setChildChecked(tempObj);
65 }
66 }
67
68 //触发事件
69 function CheckEvent()
70 {
71
72 var objNode = event.srcElement;
73
74 if(objNode.tagName!="INPUT" || objNode.type!="checkbox")
75 return;
76
77 if(objNode.checked==true)
78 {
79 setParentChecked(objNode);
80 var objID = objNode.getAttribute("ID");
81 var objID = objID.substring(0,objID.indexOf("CheckBox"));
82 var objParentDiv = document.getElementById(objID+"Nodes");
83 if(objParentDiv==null || objParentDiv == "undefined")
84 {
85 return;
86 }
87 setChildChecked(objParentDiv);
88 }
89 else
90 {
91 var objID = objNode.getAttribute("ID");
92 var objID = objID.substring(0,objID.indexOf("CheckBox"));
93 var objParentDiv = document.getElementById(objID+"Nodes");
94 if(objParentDiv==null || objParentDiv == "undefined")
95 {
96 return;
97 }
98 setChildUnChecked(objParentDiv);
99 }
100 }
101