本篇将讲述如何解决GridView控件中使用CheckBox控件无法保存状态问题。由于我们开发的CheckBox控件在GridView控件的外部使用时可以保存状态,所以我的解决方案是:另外开发一个控件,用来保存在GridView控件中的CheckBox控件的状态。我将其命名为CheckBoxHidden控件。控件代码如下:
同时,应修改第一篇的CheckBox.js文件,增加如下两个函数:
1using System;
2using System.Web.UI;
3using System.Web.UI.WebControls;
4
5namespace HughLin.Web.UI.WebControls
6{
7 public class CheckBoxHidden : System.Web.UI.WebControls.HiddenField
8 {
9 /// <summary>
10 /// 获取或设置控件所在的组名称
11 /// </summary>
12 public string Group
13 {
14 get
15 {
16 object obj1 = this.ViewState["Group"];
17 return (obj1 == null) ? string.Empty : (string)obj1;
18 }
19 set
20 {
21 this.ViewState["Group"] = value;
22 }
23 }
24
25 protected override void OnPreRender(EventArgs e)
26 {
27 if (this.Visible && !string.IsNullOrEmpty(this.Group))
28 {
29 if (!this.Page.ClientScript.IsClientScriptIncludeRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))
30 {
31 this.Page.ClientScript.RegisterClientScriptResource(typeof(CheckBox), "HughLin.CheckBox.js");
32 }
33 if (!this.Page.ClientScript.IsOnSubmitStatementRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))
34 {
35 this.Page.ClientScript.RegisterOnSubmitStatement(typeof(CheckBox), "HughLin.CheckBox.js", "AspNetV2_SaveCheckBoxGroupValue('" + this.Group + "', '" + this.ClientID + "')");
36 }
37 if (!this.Page.ClientScript.IsStartupScriptRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))
38 {
39 this.Page.ClientScript.RegisterStartupScript(typeof(CheckBox), "HughLin.CheckBox.js", "\r\n<script language='javascript'>\nAspNetV2_RestoreCheckBoxGroupValue('" + this.Group + "', '" + this.ClientID + "');\n</script>\n");
40 }
41 }
42 base.OnPreRender(e);
43 }
44 }
45}
2using System.Web.UI;
3using System.Web.UI.WebControls;
4
5namespace HughLin.Web.UI.WebControls
6{
7 public class CheckBoxHidden : System.Web.UI.WebControls.HiddenField
8 {
9 /// <summary>
10 /// 获取或设置控件所在的组名称
11 /// </summary>
12 public string Group
13 {
14 get
15 {
16 object obj1 = this.ViewState["Group"];
17 return (obj1 == null) ? string.Empty : (string)obj1;
18 }
19 set
20 {
21 this.ViewState["Group"] = value;
22 }
23 }
24
25 protected override void OnPreRender(EventArgs e)
26 {
27 if (this.Visible && !string.IsNullOrEmpty(this.Group))
28 {
29 if (!this.Page.ClientScript.IsClientScriptIncludeRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))
30 {
31 this.Page.ClientScript.RegisterClientScriptResource(typeof(CheckBox), "HughLin.CheckBox.js");
32 }
33 if (!this.Page.ClientScript.IsOnSubmitStatementRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))
34 {
35 this.Page.ClientScript.RegisterOnSubmitStatement(typeof(CheckBox), "HughLin.CheckBox.js", "AspNetV2_SaveCheckBoxGroupValue('" + this.Group + "', '" + this.ClientID + "')");
36 }
37 if (!this.Page.ClientScript.IsStartupScriptRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))
38 {
39 this.Page.ClientScript.RegisterStartupScript(typeof(CheckBox), "HughLin.CheckBox.js", "\r\n<script language='javascript'>\nAspNetV2_RestoreCheckBoxGroupValue('" + this.Group + "', '" + this.ClientID + "');\n</script>\n");
40 }
41 }
42 base.OnPreRender(e);
43 }
44 }
45}
1function AspNetV2_RestoreCheckBoxGroupValue(group, clientId)
2{
3 var objArray;
4 try
5 {
6 objArray = eval(group);
7 }
8 catch (e)
9 {
10 return;
11 }
12 if (objArray == null || objArray.length == 0)
13 {
14 return;
15 }
16 var flag = false;
17 var objArray2 = document.getElementById(clientId);
18 if (objArray2 == null || objArray2.value.length == 0)
19 {
20 flag = true;
21 }
22 if (flag)
23 {
24 for (var i = 0; i < objArray.length; i++)
25 {
26 var e = objArray[i];
27 e.checked = false;
28 }
29 }
30 else
31 {
32 var objArray3 = objArray2.value.split(",");
33 for (var i = 0; i < objArray.length; i++)
34 {
35 var e = objArray[i];
36 var flag1 = (objArray3[i].toLowerCase() == "true") ? true : false;
37 e.checked = flag1;
38 }
39 }
40}
41
42function AspNetV2_SaveCheckBoxGroupValue(group, clientId)
43{
44 var objArray;
45 try
46 {
47 objArray = eval(group);
48 }
49 catch (e)
50 {
51 return;
52 }
53 if (objArray == null || objArray.length == 0)
54 {
55 return;
56 }
57 var objValues = objArray[0].checked;
58 for (var i = 1; i < objArray.length; i++)
59 {
60 var e = objArray[i];
61 objValues += "," + objArray[i].checked;
62 }
63 document.getElementById(clientId).value = objValues;
64}
2{
3 var objArray;
4 try
5 {
6 objArray = eval(group);
7 }
8 catch (e)
9 {
10 return;
11 }
12 if (objArray == null || objArray.length == 0)
13 {
14 return;
15 }
16 var flag = false;
17 var objArray2 = document.getElementById(clientId);
18 if (objArray2 == null || objArray2.value.length == 0)
19 {
20 flag = true;
21 }
22 if (flag)
23 {
24 for (var i = 0; i < objArray.length; i++)
25 {
26 var e = objArray[i];
27 e.checked = false;
28 }
29 }
30 else
31 {
32 var objArray3 = objArray2.value.split(",");
33 for (var i = 0; i < objArray.length; i++)
34 {
35 var e = objArray[i];
36 var flag1 = (objArray3[i].toLowerCase() == "true") ? true : false;
37 e.checked = flag1;
38 }
39 }
40}
41
42function AspNetV2_SaveCheckBoxGroupValue(group, clientId)
43{
44 var objArray;
45 try
46 {
47 objArray = eval(group);
48 }
49 catch (e)
50 {
51 return;
52 }
53 if (objArray == null || objArray.length == 0)
54 {
55 return;
56 }
57 var objValues = objArray[0].checked;
58 for (var i = 1; i < objArray.length; i++)
59 {
60 var e = objArray[i];
61 objValues += "," + objArray[i].checked;
62 }
63 document.getElementById(clientId).value = objValues;
64}
同样我们将其编译到HughLin.dll中。
使用是我们只需要在第二篇中的代码中加入:
<hlAsp:CheckBoxHidden ID="CheckBoxHidden1" runat="server" Group="UserCheckBoxGroup1" />
注意:Group应当和你的CheckBox控件的Group要相同。
本系列中开发的CheckBox控件有一个好处就是:可以同时在多个GridView中使用,而互相不会干扰,只需设置Group的值不同即可。当然要保存多个GridView的CheckBox控件的状态,必须添加相应的ChekBoxHidden控件。