65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2012年11月1日

CPOL

3分钟阅读

viewsIcon

48456

downloadIcon

931

在很多情况下,数据可以绑定到 GridView 中,并且需要实现各种非 GridView 默认提供的操作。在本文中,我们将尝试将这些操作与更多功能绑定在一起。

介绍 

在很多情况下,数据可以绑定到 Gridview 中,并且需要实现各种非 Gridview 默认提供的操作。在本文中,我们将尝试将这些操作与更多功能绑定在一起。

背景

本文介绍了 Gridview 的各种事件,以及在大多数情况下需要但 ASP.NET Gridview 控件默认不提供的一些附加功能。本文是为初学者编写的,也就是说,我们将使用大量的循环和基本语言结构,并且大多数代码都可以优化。

使用代码 

我们将使用数据绑定的 GridView 实现以下附加功能。

  1. 获取 GridView 页脚中任何列的总和。
  2. 可以选中 GridView 中的几个或所有记录以进行批量操作。
  3. 将新记录插入数据库并绑定到 GridView。
  4. 使用正则表达式验证器进行验证。

让我们首先看看将在我们的演示实现中使用的数据库模式。我们有一个简单的数据库,其中包含一个名为 tmp_table 的表。它包含 4 列


在上表中

  1. ID 是一个 identity 字段
  2. unamenvarchar(50) 数据类型
  3. totalMarksfloat 数据类型,最后一个是
  4. selectedItembit 数据类型。

首先,我们将创建一个名为 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();
}

现在在 GridviewRowDataBound 事件中,我们将计算 marks 列的总计,并在相应列的 Footer 中显示它们。

以下代码片段显示了名为 lgTotsdouble 类型变量,它保持累积总和,因为行正在获取数据绑定,然后将总计分配给放置在页脚中的标签。

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 AllCheckbox 来实现,选中/取消选中它将导致分别选中/取消选中所有记录。

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;
    }
}     

现在,我们最初计划实现的其他功能已经完成。为了完整起见,我们还将实现常用的功能和事件,例如 PageIndexChangingRowEditingRowCancelingEditRowDeletingRowUpdating 用于 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 日:第二个版本
    • 实现了插入新记录的功能。
    • 使用正则表达式验证器实现了验证。
© . All rights reserved.