实现GridView控件的删除多条记录功能系列

在Asp.Net 2.0中新增的控件GridView可能是我们使用最普通的控件了,其用来显示数据的能力的确好用。GirdView内置有新增,修改,删除功能,结合ObjectDataSource控件,可以生成很好的三层体系的程序。但美中不足的就是其只支持单数据的操作,对于新增和修改而言倒还可以,但对于删除就不够了。我们往往希望能先选中我们要删除的记录,然后一次性删除,不仅方便而且提高了效率。
    为此,我们需要有能实现“全选/全不选”的CheckBox控件来配合GridView控件,以达到我们要实现的目的。
    “全选/全不选”的CheckBox控件程序代码如下:
 1using 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}

    CheckBox.js文件代码如下:
  1function 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
 28function 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
 66function 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
 82function 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}
    要使代码能够编译成功,必须在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>

 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>
在你的aspx.cs文件中实现删除方法DeleteUsers_Click
 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    }
    我在此使用的是强类型的DataSet:EmployeeData,该DataSet中有一个数据表Employee,该数据表包含列:UserName,RealName,Email。
    你可以在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    }
    本程序使用了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控件。
posted @ 2006-09-29 21:27  马建康  阅读(439)  评论(0)    收藏  举报