我想在我的页面上显示简单的gridview并为其提供排序和分页功能。单独排序和分页可以正常工作,但两者结合起来就不行了。例如,如果我对第一列进行降序排序,然后转到第二页,那么我会看到第二页数据采用默认排序(升序)。
我严重依赖这个问题的代码:GridView sorting: SortDirection always Ascending ,但问题依然存在。另外 - 看来我必须更改我的代码,以便使用 ViewState 而不是 Session 对象,还必须弄清楚这一点......
我的代码,经过简化,只有两列:
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;
}
}
最佳答案
您必须使用 ViewState 才能保留您的数据
public string SortVariable
{
get
{
if(ViewState["YourKey"] == null)
return string.Empty;
return (string)ViewState["YourKey"];
}
set
{
ViewState["YourKey"] = value;
}
}
使用此解决方案,当您更改页面时,您可以在排序之前在 View 状态中进行索引排序。
当您触发 SortCommand 时,您必须设置所描述的 View 状态的值
您不需要 session ,因为您在同一页面中,不需要导航
protected void OnSort(object sender, GridViewSortEventArgs e)
{
//Here you set your value SortVariable
SortVariable = e.SortExpression;
...
}
并在显示数据中
您创建数据 View 并排序处理
private void DisplayData()
{
//GetSortVariable
//before bind with dataview you sort
}
关于c# - GridView排序和分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159996/