在ASP.NET开发中,GridView控件是一个常用的数据展示组件。它提供了丰富的功能,但有时默认的功能并不能满足需求。本文将介绍如何在GridView控件中实现一些高级功能,包括数据绑定、事件处理以及功能扩展。
本文面向初学者,将使用大量的循环和基本语言结构,代码可以进一步优化。将通过一个简单的数据库表tmp_table来演示如何实现这些功能。
示例数据库包含一个名为tmp_table的表,它有以下四个字段:
首先,将创建一个名为BindGridView()的函数,用于将从数据库中检索到的数据绑定到GridView控件。
protected void BindGridView()
{
    DataTable dt = null;
    using (SqlConnection 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事件中,将计算总分列的总和,并在相应列的页脚中显示。
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();
}
    
接下来,将实现选择单个或全部记录的功能。将在GridView的表头中添加一个“全选”复选框,通过选中或取消选中它,可以分别选中或取消选中所有记录。
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;
    }
}
    
除了上述功能外,还将实现一些额外的功能,如插入新记录到数据库。为此,在GridView的页脚中添加了一个TemplateField,用于同时插入姓名和分数。
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 (SqlConnection 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();
}
    
为了确保数据的正确性,将使用正则表达式验证器来验证用户输入。
// 示例代码:使用正则表达式验证器验证用户名
RegexValidator rv = new RegexValidator();
rv.ValidationExpression = @"^[a-zA-Z0-9_.-]+$";
rv.ErrorMessage = "用户名只能包含字母、数字、下划线、点和破折号。";