分页并排序
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Web.UI" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState["Orderby"] = "c1";
ViewState["Sort"] = "ASC";
this.Bind();
}
}
private void Bind()
{
DataTable dt = this.CreateDataSource();
DataView dv = dt.DefaultView;
string Orderby = (string)ViewState["Orderby"] + " " + (string)ViewState["Sort"];
dv.Sort = Orderby;
GridView1.DataSource = dv;
GridView1.DataKeyNames = new string[] { "c1" };
GridView1.DataBind();
}
private DataTable CreateDataSource()
{
DataTable dt = new DataTable();
dt.Columns.Add("c1", typeof(int));
dt.Columns.Add("c2", typeof(string));
dt.Columns.Add("c3", typeof(string));
for (int i = 0; i < 100; i++)
{
DataRow dr = dt.NewRow();
dr[0] = i;
dr[1] = i;
dr[2] = i;
dt.Rows.Add(dr);
}
return dt;
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
GridView1.PageIndex = e.NewPageIndex;
this.Bind();
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
string Orderby = e.SortExpression;
if (ViewState["Orderby"].ToString() == Orderby)
{
if (ViewState["Sort"].ToString() == "Desc")
ViewState["Sort"] = "ASC";
else
ViewState["Sort"] = "Desc";
}
else
{
ViewState["Orderby"] = e.SortExpression;
}
this.Bind();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:GridView ID="GridView1" runat="server" OnSorting="GridView1_Sorting" AllowSorting="True"
OnPageIndexChanging="GridView1_PageIndexChanging" AutoGenerateColumns="False"
AllowPaging="True">
<Columns>
<asp:BoundField DataField="c1" HeaderText="列1" SortExpression="c1" />
<asp:BoundField DataField="c2" HeaderText="列2" SortExpression="c2" />
<asp:BoundField DataField="c3" HeaderText="列3" SortExpression="c3" />
</Columns>
</asp:GridView>
</form>
</body>
</html>
说明
针对分页部分
(1) 在 Page_Load 事件里设置 GridView 的“分页(AllowPaging)”、“每页记录条数(PageSize)”、“自动产生列(AutoGenerateColumns)”属性,这些属性也可以直接在控件里设置;
(2) 然后从数据库中获得数据集,并设置主键,再绑定到控件;
(3) 主键可以不设置,设置主键主要是为了便于在 GridView 控件中利用主键直接定位到某条记录,如:GridView1.DataKeys[e.RowIndex].Value,对该记录进行编辑、修改和删除操作;
(4) 如果不设置主键,也可以从 GridView 单元格里直接获取数据 GridView1.Rows[i].Cells[i].toString(),如果 GridView 控件处于编辑状态,要将其转换成相应的控件类型;
(5) 默认情况下,处于编辑状态的 GridView 控件,每个单元格是 TextBox 控件。如果使用模板列,自定义每个单元格的控件,如单选框或复选框,则要进行相应的转换;
(6) 一般,若想获得某条记录某列的值,是通过模板列中控件的ID在 GridView 控件里进行查找,例如:
(CheckBox)GridView1.Rows[i].FindControl("CheckBox1");
含义:在 GridView 控件的第 i 行上,查找“ID”为“CheckBox1”的控件,并转换成 CheckBox 类型,这样就可以对这个单元格进行形如 CheckBox 控件的操作。
另外,无论何时你都可以遍历 GridView 的标题和网格内容。如下代码遍历 GridView 的标题:
for (int i = 0; i <= GridView1.HeaderRow.Cells.Count - 1; i++)
{
string str = GridView1.HeaderRow.Cells[i].Text;
// ......
}
如下代码遍历 GridView 的内容:
for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
{
for (int j = 1; j <= GridView1.HeaderRow.Cells.Count - 1; j++)
{
string str = GridView1.Rows[i].Cells[j].Text;
// ......
}
}
(7) 对于数据分页,一般不采用ASP.NET自带的,比较难看,而是采用专门的分页控件。分页控件有各种式样,其实原理都一样,将SQL语句、当前页数和总页数保存到页面变量中,根据需要在页面上Render画出来。
针对排序部分
(1) 设置GridView控件的AutoGenerateColumns(是否自动产生列)和AllowSorting(是否允许排序)属性;
(2) 在GridView控件里用BoundField自定义绑定列(字段),并设置其属性DataField、HeaderText和SortExpression设置绑定列名、显示列名和排序字段;
(3) 在Page_Load事件里设置默认的排序字段和排序方式,绑定到控件;
(4) 实现排序功能必须使用数据集的视图。在自定义绑定函数Bind()中,使用DataTable数据集的视图DefaultView绑定控件,从页面的视图变量Sort和Order中获得当前的排序字段和排序方式,赋值给数据集视图DefaultView的成员变量Sort,绑定到控件;
(5) 最后,在GridView1_Sorting事件中,用e.SortExpression获得当前的排序字段,并根据实际改变排序字段和排序方式,绑定到控件。