实现GridView控件的删除多条记录功能系列
在Asp.Net 2.0中新增的控件GridView可能是我们使用最普通的控件了,其用来显示数据的能力的确好用。GirdView内置有新增,修改,删除功能,结合ObjectDataSource控件,可以生成很好的三层体系的程序。但美中不足的就是其只支持单数据的操作,对于新增和修改而言倒还可以,但对于删除就不够了。我们往往希望能先选中我们要删除的记录,然后一次性删除,不仅方便而且提高了效率。
为此,我们需要有能实现“全选/全不选”的CheckBox控件来配合GridView控件,以达到我们要实现的目的。
“全选/全不选”的CheckBox控件程序代码如下:
CheckBox.js文件代码如下:
要使代码能够编译成功,必须在AssemblyInfo.cs文件中配置js文件的引用
using System.Web.UI;
[assembly: WebResource("HughLin.CheckBox.js", "application/x-javascript")]
编译后生成 HughLin.dll
首先,在你的网站的Web.config文件中配置对该控件的引用。
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.web>
<pages>
<controls>
<add namespace="HughLin.Web.UI.WebControls" tagPrefix="hlAsp" assembly="HughLin"/>
</controls>
</pages>
</system.web>
在你的aspx文件中,使用如下:
<asp:LinkButton ID="DeleteUsers" runat="server" OnClientClick="if (AspNetV2_CheckHasData('UserCheckBoxGroup1')) {return confirm('您确定要删除所选用户吗?');};else {alert('您还未选择用户!');return false;}" OnClick="DeleteUsers_Click" CausesValidation="false">删除用户</asp:LinkButton>
在你的aspx.cs文件中实现删除方法DeleteUsers_Click
我在此使用的是强类型的DataSet:EmployeeData,该DataSet中有一个数据表Employee,该数据表包含列:UserName,RealName,Email。
你可以在App_Code文件夹中添加该数据集。并添加EmployeeBLL.cs文件,代码如下:
本程序使用了GotDotNet的DataAccess Application Block 3.0控件,该控件及其使用方法可以到www.gotdotnet.com去下载。
不过,在使用的过程,我发现如果PostBack后CheckBox控件的选择状态不能保存。美中不足,为此我改进了CheckBox控件。在下一篇中,我将发布该解决方案,这又将设计到另一个控件的开发。
本篇将讲述如何解决GridView控件中使用CheckBox控件无法保存状态问题。由于我们开发的CheckBox控件在GridView控件的外部使用时可以保存状态,所以我的解决方案是:另外开发一个控件,用来保存在GridView控件中的CheckBox控件的状态。我将其命名为CheckBoxHidden控件。控件代码如下:
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 /**////
10 /// 获取或设置控件所在的组名称
11 ///
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 \n");
40 }
41 }
42 base.OnPreRender(e);
43 }
44 }
45}
同时,应修改第一篇的CheckBox.js文件,增加如下两个函数:
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}
同样我们将其编译到HughLin.dll中。 使用是我们只需要在第二篇中的代码中加入: 注意:Group应当和你的CheckBox控件的Group要相同。 本系列中开发的CheckBox控件有一个好处就是:可以同时在多个GridView中使用,而互相不会干扰,只需设置Group的值不同即可。当然要保存多个GridView的CheckBox控件的状态,必须添加相应的ChekBoxHidden控件。
为此,我们需要有能实现“全选/全不选”的CheckBox控件来配合GridView控件,以达到我们要实现的目的。
“全选/全不选”的CheckBox控件程序代码如下:
1
using System;
2
using System.Collections.Specialized;
3
using System.Web;
4
using System.Web.UI;
5
using System.Web.UI.WebControls;
6![]()
7
namespace HughLin.Web.UI.WebControls
8
{
9
/// <summary>
10
/// 可全选/全不选复选框控件
11
/// </summary>
12
public class CheckBox : System.Web.UI.WebControls.CheckBox
13
{
14
public CheckBox()
15
{
16
}
17![]()
18
/// <summary>
19
/// 获取或设置被绑定的数据
20
/// </summary>
21
public string BindedValue
22
{
23
get
24
{
25
object obj1 = this.ViewState["BindedValue"];
26
return (obj1 == null) ? string.Empty : (string)obj1;
27
}
28
set
29
{
30
if (!string.IsNullOrEmpty(value))
31
{
32
this.ViewState["BindedValue"] = value;
33
}
34
}
35
}
36![]()
37
/// <summary>
38
/// 获取或设置控件所在的组名称
39
/// </summary>
40
public string Group
41
{
42
get
43
{
44
object obj1 = this.ViewState["Group"];
45
return (obj1 == null) ? string.Empty : (string)obj1;
46
}
47
set
48
{
49
this.ViewState["Group"] = value;
50
}
51
}
52![]()
53
/// <summary>
54
/// 获取或设置一个值,该值标识控件是否为父级别
55
/// </summary>
56
public bool IsParent
57
{
58
get
59
{
60
object obj1 = this.ViewState["IsParent"];
61
return (obj1 == null) ? false : (bool)obj1;
62
}
63
set
64
{
65
this.ViewState["IsParent"] = value;
66
}
67
}
68![]()
69
protected override void OnPreRender(EventArgs e)
70
{
71
if (this.Visible && this.Enabled && !string.IsNullOrEmpty(this.Group))
72
{
73
if (!this.Page.ClientScript.IsClientScriptIncludeRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))
74
{
75
this.Page.ClientScript.RegisterClientScriptResource(typeof(CheckBox), "HughLin.CheckBox.js");
76
}
77
string text1 = "document.getElementById(\"" + this.ClientID + "\")";
78
this.Page.ClientScript.RegisterArrayDeclaration(this.Group, text1);
79
}
80
base.OnPreRender(e);
81
}
82![]()
83
protected override void Render(HtmlTextWriter writer)
84
{
85
if (this.Enabled && this.Visible && !string.IsNullOrEmpty(this.Group))
86
{
87
if (!string.IsNullOrEmpty(this.BindedValue))
88
{
89
writer.AddAttribute("value", this.BindedValue);
90
}
91
writer.AddAttribute("isparent", this.IsParent.ToString());
92
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "javascript:AspNetV2_Check(this, '" + this.Group + "');");
93
}
94
base.Render(writer);
95
}
96
}
97
}
using System;2
using System.Collections.Specialized;3
using System.Web;4
using System.Web.UI;5
using System.Web.UI.WebControls;6

7
namespace HughLin.Web.UI.WebControls8
{9
/// <summary>10
/// 可全选/全不选复选框控件11
/// </summary>12
public class CheckBox : System.Web.UI.WebControls.CheckBox13
{14
public CheckBox()15
{16
}17

18
/// <summary>19
/// 获取或设置被绑定的数据20
/// </summary>21
public string BindedValue22
{23
get24
{25
object obj1 = this.ViewState["BindedValue"];26
return (obj1 == null) ? string.Empty : (string)obj1;27
}28
set29
{30
if (!string.IsNullOrEmpty(value))31
{32
this.ViewState["BindedValue"] = value;33
}34
}35
}36

37
/// <summary>38
/// 获取或设置控件所在的组名称39
/// </summary>40
public string Group41
{42
get43
{44
object obj1 = this.ViewState["Group"];45
return (obj1 == null) ? string.Empty : (string)obj1;46
}47
set48
{49
this.ViewState["Group"] = value;50
}51
}52

53
/// <summary>54
/// 获取或设置一个值,该值标识控件是否为父级别55
/// </summary>56
public bool IsParent57
{58
get59
{60
object obj1 = this.ViewState["IsParent"];61
return (obj1 == null) ? false : (bool)obj1;62
}63
set64
{65
this.ViewState["IsParent"] = value;66
}67
}68

69
protected override void OnPreRender(EventArgs e)70
{71
if (this.Visible && this.Enabled && !string.IsNullOrEmpty(this.Group))72
{73
if (!this.Page.ClientScript.IsClientScriptIncludeRegistered(typeof(CheckBox), "HughLin.CheckBox.js"))74
{75
this.Page.ClientScript.RegisterClientScriptResource(typeof(CheckBox), "HughLin.CheckBox.js");76
}77
string text1 = "document.getElementById(\"" + this.ClientID + "\")";78
this.Page.ClientScript.RegisterArrayDeclaration(this.Group, text1);79
}80
base.OnPreRender(e);81
}82

83
protected override void Render(HtmlTextWriter writer)84
{85
if (this.Enabled && this.Visible && !string.IsNullOrEmpty(this.Group))86
{87
if (!string.IsNullOrEmpty(this.BindedValue))88
{89
writer.AddAttribute("value", this.BindedValue);90
}91
writer.AddAttribute("isparent", this.IsParent.ToString());92
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "javascript:AspNetV2_Check(this, '" + this.Group + "');");93
}94
base.Render(writer);95
}96
}97
}CheckBox.js文件代码如下:
1
function AspNetV2_Check(item, group)
2
{
3
var itemIsParent = (item.isparent.toLowerCase() == "true") ? true : false;
4
var itemChecked = item.checked;
5
var objArray;
6
try
7
{
8
objArray = eval(group);
9
}
10
catch (e)
11
{
12
return;
13
}
14
if (objArray == null || objArray.length == 0)
15
{
16
return;
17
}
18
if (itemIsParent)
19
{
20
AspNetV2_CheckAll(objArray, itemChecked);
21
}
22
else
23
{
24
AspNetV2_CheckIt(objArray, itemChecked);
25
}
26
}
27![]()
28
function AspNetV2_CheckIt(newArray, itemChecked)
29
{
30
if (!itemChecked)
31
{
32
for (var i = 0; i < newArray.length; i++)
33
{
34
var e = newArray[i];
35
var isParent = (e.isparent.toLowerCase() == "true") ? true : false;
36
if (isParent)
37
{
38
e.checked = false;
39
}
40
}
41
}
42
else
43
{
44
var objAll;
45
var allChecked = 0;
46
for (var i = 0; i < newArray.length; i++)
47
{
48
var e = newArray[i];
49
var isParent = (e.isparent.toLowerCase() == "true") ? true : false;
50
if (e.checked && !isParent)
51
{
52
allChecked++;
53
}
54
else if (isParent)
55
{
56
objAll = e;
57
}
58
}
59
if (allChecked == newArray.length - 1)
60
{
61
objAll.checked = true;
62
}
63
}
64
}
65![]()
66
function AspNetV2_CheckAll(newArray, itemChecked)
67
{
68
for (var i = 0; i < newArray.length; i++)
69
{
70
var e = newArray[i];
71
var isParent = (e.isparent.toLowerCase() == "true") ? true : false;
72
if (!isParent)
73
{
74
if (e.checked != itemChecked)
75
{
76
e.checked = itemChecked;
77
}
78
}
79
}
80
}
81![]()
82
function AspNetV2_CheckHasData(group)
83
{
84
var objArray;
85
var hasData = false;
86
try
87
{
88
objArray = eval(group);
89
}
90
catch (e)
91
{
92
return hasData;
93
}
94
if (objArray == null || objArray.length == 0)
95
{
96
return hasData;
97
}
98
for (var i = 0; i < objArray.length; i++)
99
{
100
var e = objArray[i];
101
if (e.checked)
102
{
103
hasData = true;
104
break;
105
}
106
}
107
return hasData;
108
}
function AspNetV2_Check(item, group)2
{3
var itemIsParent = (item.isparent.toLowerCase() == "true") ? true : false;4
var itemChecked = item.checked;5
var objArray;6
try7
{8
objArray = eval(group);9
}10
catch (e)11
{12
return;13
}14
if (objArray == null || objArray.length == 0)15
{16
return;17
}18
if (itemIsParent)19
{20
AspNetV2_CheckAll(objArray, itemChecked);21
}22
else23
{24
AspNetV2_CheckIt(objArray, itemChecked);25
}26
}27

28
function AspNetV2_CheckIt(newArray, itemChecked)29
{30
if (!itemChecked)31
{32
for (var i = 0; i < newArray.length; i++)33
{34
var e = newArray[i];35
var isParent = (e.isparent.toLowerCase() == "true") ? true : false;36
if (isParent)37
{38
e.checked = false;39
}40
}41
}42
else43
{44
var objAll;45
var allChecked = 0;46
for (var i = 0; i < newArray.length; i++)47
{48
var e = newArray[i];49
var isParent = (e.isparent.toLowerCase() == "true") ? true : false;50
if (e.checked && !isParent)51
{52
allChecked++;53
}54
else if (isParent)55
{56
objAll = e;57
}58
}59
if (allChecked == newArray.length - 1)60
{61
objAll.checked = true;62
}63
}64
}65

66
function AspNetV2_CheckAll(newArray, itemChecked)67
{68
for (var i = 0; i < newArray.length; i++)69
{70
var e = newArray[i];71
var isParent = (e.isparent.toLowerCase() == "true") ? true : false;72
if (!isParent)73
{74
if (e.checked != itemChecked)75
{76
e.checked = itemChecked;77
}78
}79
}80
}81

82
function AspNetV2_CheckHasData(group)83
{84
var objArray;85
var hasData = false;86
try87
{88
objArray = eval(group);89
}90
catch (e)91
{92
return hasData;93
}94
if (objArray == null || objArray.length == 0)95
{96
return hasData;97
}98
for (var i = 0; i < objArray.length; i++)99
{100
var e = objArray[i];101
if (e.checked)102
{103
hasData = true;104
break;105
}106
}107
return hasData;108
}using System.Web.UI;
[assembly: WebResource("HughLin.CheckBox.js", "application/x-javascript")]
编译后生成 HughLin.dll
首先,在你的网站的Web.config文件中配置对该控件的引用。
<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<system.web>
<pages>
<controls>
<add namespace="HughLin.Web.UI.WebControls" tagPrefix="hlAsp" assembly="HughLin"/>
</controls>
</pages>
</system.web>
<asp:LinkButton ID="DeleteUsers" runat="server" OnClientClick="if (AspNetV2_CheckHasData('UserCheckBoxGroup1')) {return confirm('您确定要删除所选用户吗?');};else {alert('您还未选择用户!');return false;}" OnClick="DeleteUsers_Click" CausesValidation="false">删除用户</asp:LinkButton> 1
<asp:GridView ID="EmployeeGrid" runat="server" AutoGenerateColumns="False" DataKeyNames="UserName"
2
DataSourceID="EmployeeGridDataSource">
3
<Columns>
4
<asp:TemplateField>
5
<HeaderTemplate>
6
<hlAsp:CheckBox ID="SelectAll" runat="server" Group="UserCheckBoxGroup1" IsParent="true"
7
Text="全选" />
8
</HeaderTemplate>
9
<HeaderStyle Width="50px" />
10
<ItemStyle Width="50px" />
11
<ItemTemplate>
12
<hlAsp:CheckBox ID="UserNameCheckBox" runat="server" Group="UserCheckBoxGroup1" BindedValue='<%# Eval("UserName") %>' />
13
</ItemTemplate>
14
</asp:TemplateField>
15
<asp:BoundField DataField="RealName" HeaderText="姓名" SortExpression="RealName">
16
<HeaderStyle Width="100px" />
17
<ItemStyle Width="100px" />
18
</asp:BoundField>
23
<asp:BoundField DataField="Email" HeaderText="电子信箱" SortExpression="Email">
24
<HeaderStyle Width="160px" />
25
<ItemStyle Width="160px" HorizontalAlign="left" />
26
</asp:BoundField>
27
</Columns>
28
</asp:GridView>
29
<asp:ObjectDataSource ID="EmployeeGridDataSource" runat="server" SelectMethod="GetAllEmployees"
30
TypeName="EmployeeBLL">
31
</asp:ObjectDataSource>
<asp:GridView ID="EmployeeGrid" runat="server" AutoGenerateColumns="False" DataKeyNames="UserName"2
DataSourceID="EmployeeGridDataSource">3
<Columns>4
<asp:TemplateField>5
<HeaderTemplate>6
<hlAsp:CheckBox ID="SelectAll" runat="server" Group="UserCheckBoxGroup1" IsParent="true"7
Text="全选" />8
</HeaderTemplate>9
<HeaderStyle Width="50px" />10
<ItemStyle Width="50px" />11
<ItemTemplate>12
<hlAsp:CheckBox ID="UserNameCheckBox" runat="server" Group="UserCheckBoxGroup1" BindedValue='<%# Eval("UserName") %>' />13
</ItemTemplate>14
</asp:TemplateField>15
<asp:BoundField DataField="RealName" HeaderText="姓名" SortExpression="RealName">16
<HeaderStyle Width="100px" />17
<ItemStyle Width="100px" />18
</asp:BoundField>23
<asp:BoundField DataField="Email" HeaderText="电子信箱" SortExpression="Email">24
<HeaderStyle Width="160px" />25
<ItemStyle Width="160px" HorizontalAlign="left" />26
</asp:BoundField>27
</Columns>28
</asp:GridView>29
<asp:ObjectDataSource ID="EmployeeGridDataSource" runat="server" SelectMethod="GetAllEmployees"30
TypeName="EmployeeBLL">31
</asp:ObjectDataSource> 1
// 删除用户
2
protected void DeleteUsers_Click(object sender, EventArgs e)
3
{
4
EmployeeData employeeData = new EmployeeData();
5![]()
6
// 获取被选中的用户名集合
7
foreach (GridViewRow row in EmployeeGrid.Rows)
8
{
9
TableCell cell = row.Cells[0];
10
HughLin.Web.UI.WebControls.CheckBox userNameCheckBox = (HughLin.Web.UI.WebControls.CheckBox)cell.FindControl("UserNameCheckBox");
11
if (userNameCheckBox.Checked)
12
{
13
string userName = userNameCheckBox.BindedValue;
14
EmployeeData.EmployeeRow dataRow = employeeData.Employee.NewEmployeeRow();
15
dataRow.UserName = userName;
16
employeeData.Employee.Rows.Add(dataRow);
17
dataRow.AcceptChanges();
18
dataRow.Delete();
19
}
20
}
21
bool flag = (new EmployeeBLL()).DeleteEmployee(employeeData);
22
if (flag)
23
{
24
EmployeeGrid.DataBind();
25
}
26
}
// 删除用户2
protected void DeleteUsers_Click(object sender, EventArgs e)3
{4
EmployeeData employeeData = new EmployeeData();5

6
// 获取被选中的用户名集合7
foreach (GridViewRow row in EmployeeGrid.Rows)8
{9
TableCell cell = row.Cells[0];10
HughLin.Web.UI.WebControls.CheckBox userNameCheckBox = (HughLin.Web.UI.WebControls.CheckBox)cell.FindControl("UserNameCheckBox");11
if (userNameCheckBox.Checked)12
{13
string userName = userNameCheckBox.BindedValue;14
EmployeeData.EmployeeRow dataRow = employeeData.Employee.NewEmployeeRow();15
dataRow.UserName = userName;16
employeeData.Employee.Rows.Add(dataRow);17
dataRow.AcceptChanges();18
dataRow.Delete();19
}20
}21
bool flag = (new EmployeeBLL()).DeleteEmployee(employeeData);22
if (flag)23
{24
EmployeeGrid.DataBind();25
}26
}你可以在App_Code文件夹中添加该数据集。并添加EmployeeBLL.cs文件,代码如下:
1
/// <summary>
2
/// 删除员工数据
3
/// </summary>
4
/// <param name="employeeData">员工数据集合</param>
5
/// <returns>删除是否成功</returns>
6
public bool DeleteEmployee(EmployeeData employeeData)
7
{
8
bool flag = false;
9
IDbTransaction tran = null;
10
string[] sourceColumns =
11
new string[] { employeeData.Employee.UserNameColumn.ColumnName };
12
try
13
{
14
AdoHelper adoHelper = AdoHelper.CreateHelper(DbUtil.DbProvider);
15
IDbCommand insertCommand = null;
16
IDbCommand updateCommand = null;
17
IDbConnection conn = adoHelper.GetConnection(DbUtil.ConnectionString);
18
conn.Open();
19
tran = conn.BeginTransaction();
20
IDbCommand deleteCommand = adoHelper.CreateCommand(conn, "DeleteEmployee", sourceColumns);
21
deleteCommand.Transaction = tran;
22
adoHelper.UpdateDataset(insertCommand, deleteCommand, updateCommand, employeeData, employeeData.Employee.TableName);
23
tran.Commit();
24
flag = true;
25
}
26
catch
27
{
28
try
29
{
30
if (tran != null)
31
{
32
tran.Rollback();
33
}
34
}
35
catch
36
{
37
}
38
}
39
return flag;
40
}
/// <summary>2
/// 删除员工数据3
/// </summary>4
/// <param name="employeeData">员工数据集合</param>5
/// <returns>删除是否成功</returns>6
public bool DeleteEmployee(EmployeeData employeeData)7
{8
bool flag = false;9
IDbTransaction tran = null;10
string[] sourceColumns = 11
new string[] { employeeData.Employee.UserNameColumn.ColumnName };12
try13
{14
AdoHelper adoHelper = AdoHelper.CreateHelper(DbUtil.DbProvider);15
IDbCommand insertCommand = null;16
IDbCommand updateCommand = null;17
IDbConnection conn = adoHelper.GetConnection(DbUtil.ConnectionString);18
conn.Open();19
tran = conn.BeginTransaction();20
IDbCommand deleteCommand = adoHelper.CreateCommand(conn, "DeleteEmployee", sourceColumns);21
deleteCommand.Transaction = tran;22
adoHelper.UpdateDataset(insertCommand, deleteCommand, updateCommand, employeeData, employeeData.Employee.TableName);23
tran.Commit();24
flag = true;25
}26
catch27
{28
try29
{30
if (tran != null)31
{32
tran.Rollback();33
}34
}35
catch36
{37
}38
}39
return flag;40
}不过,在使用的过程,我发现如果PostBack后CheckBox控件的选择状态不能保存。美中不足,为此我改进了CheckBox控件。在下一篇中,我将发布该解决方案,这又将设计到另一个控件的开发。
本篇将讲述如何解决GridView控件中使用CheckBox控件无法保存状态问题。由于我们开发的CheckBox控件在GridView控件的外部使用时可以保存状态,所以我的解决方案是:另外开发一个控件,用来保存在GridView控件中的CheckBox控件的状态。我将其命名为CheckBoxHidden控件。控件代码如下:
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 /**////
11 ///
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 \n");
40 }
41 }
42 base.OnPreRender(e);
43 }
44 }
45}
同时,应修改第一篇的CheckBox.js文件,增加如下两个函数:
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}
同样我们将其编译到HughLin.dll中。 使用是我们只需要在第二篇中的代码中加入:
