我想在我的页面上显示简单的 gridview 并为其提供排序和分页功能。单独排序和分页工作正常,但两者的组合却不行。例如,如果我对第一列进行降序排序,然后转到第二页,那么我会看到默认排序(升序)的第二页数据。
我严重依赖这个问题的代码:GridView 排序:SortDirection always Ascending,但问题仍然存在。另外 - 似乎我必须更改我的代码,以便使用 Session 对象而不是 ViewState,还必须弄清楚这一点......
我的代码经过简化,只有两列:
aspx:
<asp:GridView ID="dgvView" runat="server" AutoGenerateColumns="false" AllowPaging="true"
PageSize="10" AllowSorting="True" OnPageIndexChanging="DgvViewPageIndexChanging" OnSorting="OnSort">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name">
<ItemStyle />
</asp:BoundField>
<asp:BoundField DataField="BirthDate" HeaderText="Birth date" DataFormatString="{0:dd.MM.yyyy}"
SortExpression="BirthDate">
<ItemStyle />
</asp:BoundField>
</Columns>
</asp:GridView>
和代码隐藏:
public partial class TestPage :Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DisplayData();
}
}
private void DisplayData()
{
Session["TableView"] = GetUsers();
dgvView.DataSource = Session["TableView"];
dgvView.DataBind();
}
protected void DgvViewPageIndexChanging(object sender, GridViewPageEventArgs e)
{
dgvView.PageIndex = e.NewPageIndex;
DisplayData();
}
private List<MyUser> GetUsers()
{
var users = new List<MyUser>();
for (int i = 0; i < 100; i++)
{
users.Add(new MyUser("Name" + i.ToString().PadLeft(2, '0'), new DateTime(2000, 1, 1).AddDays(i)));
}
return users;
}
private class MyUser
{
public string Name { get; private set; }
public DateTime BirthDate { get; private set; }
public MyUser(string name, DateTime birthDate)
{
Name = name;
BirthDate = birthDate;
}
}
protected void OnSort(object sender, GridViewSortEventArgs e)
{
Func<MyUser, object> f;
if (e.SortExpression == "Name") f = u => u.Name;
else f = u => u.BirthDate;
dgvView.DataSource = Sort((List<MyUser>)Session["TableView"], f, GetSortDirection(e.SortExpression));
dgvView.DataBind();
}
private List<MyUser> Sort<T>(IEnumerable<MyUser> user, Func<MyUser, T> f, SortDirection sortDirection)
{
if (sortDirection == SortDirection.Ascending) return user.OrderBy(f).ToList();
return user.OrderByDescending(f).ToList();
}
private SortDirection GetSortDirection(string column)
{
string sessionVariable = "TableSort" + column;
SortDirection sortDirection;
if (Session[sessionVariable] == null)
{
sortDirection = SortDirection.Ascending;
}
else if ((SortDirection)Session[sessionVariable] == SortDirection.Ascending)
{
sortDirection = SortDirection.Descending;
}
else
{
sortDirection = SortDirection.Ascending;
}
Session[sessionVariable] = sortDirection;
return sortDirection;
}
}