在 ASP.NET GridView 中使用事件实现累积总数和全选功能





5.00/5 (4投票s)
在很多情况下,数据可以绑定到 GridView 中,并且需要实现各种非 GridView 默认提供的操作。在本文中,我们将尝试将这些操作与更多功能绑定在一起。
介绍
在很多情况下,数据可以绑定到 Gridview
中,并且需要实现各种非 Gridview
默认提供的操作。在本文中,我们将尝试将这些操作与更多功能绑定在一起。
背景
本文介绍了 Gridview
的各种事件,以及在大多数情况下需要但 ASP.NET Gridview
控件默认不提供的一些附加功能。本文是为初学者编写的,也就是说,我们将使用大量的循环和基本语言结构,并且大多数代码都可以优化。
使用代码
我们将使用数据绑定的 GridView 实现以下附加功能。
- 获取 GridView 页脚中任何列的总和。
- 可以选中 GridView 中的几个或所有记录以进行批量操作。
- 将新记录插入数据库并绑定到 GridView。
- 使用正则表达式验证器进行验证。
让我们首先看看将在我们的演示实现中使用的数据库模式。我们有一个简单的数据库,其中包含一个名为 tmp_table
的表。它包含 4 列

在上表中
- ID 是一个
identity
字段 - uname 是
nvarchar(50)
数据类型 - totalMarks 是
float
数据类型,最后一个是 - selectedItem 是
bit
数据类型。
首先,我们将创建一个名为 BindGridView()
的函数,其中在 Datatable
中获取的详细信息将绑定到 Gridview
。
protected void BindGridView()
{
DataTable dt = null;
using (conn = new SqlConnection(ConfigurationManager.ConnectionStrings["tempdbConn"].ConnectionString))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select row_number() OVER (ORDER BY id) " +
"AS sno,id,uname,totalMarks,selectedItem from tmp_table";
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
dt = new DataTable();
da.Fill(dt);
}
}
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
现在在 Gridview
的 RowDataBound
事件中,我们将计算 marks 列的总计,并在相应列的 Footer
中显示它们。
以下代码片段显示了名为
lgTots
的 double
类型变量,它保持累积总和,因为行正在获取数据绑定,然后将总计分配给放置在页脚中的标签。
if (e.Row.RowType == DataControlRowType.DataRow)
{
lgTots += Convert.ToDouble(DataBinder.Eval(e.Row.DataItem, "totalMarks"));
}
if (e.Row.RowType == DataControlRowType.Footer)
{
Label lgTotal = (Label)e.Row.FindControl("lblGrandTotal");
lgTotal.Text = lgTots.ToString();
}
现在来看看另一个功能,即选择几个或所有 CheckBox
。我们将通过在 Header
中放置一个 Select All
的 Checkbox
来实现,选中/取消选中它将导致分别选中/取消选中所有记录。
CheckBox chkA = GridView1.HeaderRow.FindControl("chekSelectALL") as CheckBox;
foreach (GridViewRow gv in GridView1.Rows)
{
CheckBox chkS = gv.FindControl("chekSelect") as CheckBox;
if (chkA.Checked)
{
chkS.Checked = true;
}
else
{
chkS.Checked = false;
}
}
现在,我们最初计划实现的其他功能已经完成。为了完整起见,我们还将实现常用的功能和事件,例如 PageIndexChanging
、RowEditing
、RowCancelingEdit
、RowDeleting
、RowUpdating
用于 Gridview
。
现在,当我们运行应用程序时,我们可以看到这个 Gridview
的所有常用功能都在工作,以及我们已实现的附加功能。
在下一个版本中,我们将看到如何将新记录插入数据库,对于此实现,让我们在 Footer 中有一个用于同时插入名称和分数的 TemplateField
Texbox
。在 LinkButton lnkInsert 的 OnClick 事件中,我们将编写以下代码
protected void lnkInsert_Click(object sender, EventArgs e)
{
string nme = string.Empty;
TextBox tb = GridView1.FooterRow.FindControl("txtName") as TextBox;
if (tb != null)
{
nme = tb.Text.Trim();
}
string mrks = string.Empty;
tb = null;
tb = GridView1.FooterRow.FindControl("txtTotalMarks") as TextBox;
if (tb != null)
{
mrks = tb.Text.Trim();
}
bool chkSele = false;
CheckBox chk = GridView1.FooterRow.FindControl("chekSelect") as CheckBox;
if (chk != null)
{
if (chk.Checked == true)
{
chkSele = true;
}
else
{
chkSele = false;
}
}
using (conn = new SqlConnection(ConfigurationManager.ConnectionStrings["tempdbConn"].ConnectionString))
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "Insert into tmp_table(uname,totalMarks,selectedItem) values(@nme,@mrks,@selectItem)";
cmd.Parameters.AddWithValue("@nme", nme);
cmd.Parameters.AddWithValue("@mrks", mrks);
cmd.Parameters.AddWithValue("@selectItem", chkSele);
conn.Open();
cmd.ExecuteNonQuery();
}
}
BindGridView();
}

实现了验证

关注点
在本文中,我们尝试使用 Gridview
控件实现一些常用的功能,以及 ASP.NET 提供的默认功能。代码可以在很多方面进行改进,但由于它是为初级程序员编写的,因此我试图保持逻辑简单。 我将实现更多此类功能并更新本文。
历史
- 2012 年 11 月 1 日:第一个版本。
- 2012 年 11 月 2 日:第二个版本
- 实现了插入新记录的功能。
- 使用正则表达式验证器实现了验证。