在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 = "用户名只能包含字母、数字、下划线、点和破折号。";