내 페이지에 간단한 gridview를 표시하고 정렬 및 페이징 기능을 제공하고 싶습니다. 개별적으로 정렬 및 페이징은 제대로 작동하지만 둘의 조합은 그렇지 않습니다. 예를 들어 첫 번째 열을 내림차순으로 정렬 한 다음 두 번째 페이지로 이동하면 기본 정렬 (오름차순)으로 두 번째 데이터 페이지가 표시됩니다.GridView 정렬 및 페이징
이 질문의 코드에 크게 의존 : GridView sorting: SortDirection always Ascending,하지만 문제가 남아 있습니다.
영문 : - 또한 그것은 내가 대신 세션의 객체의 ViewState를 사용하도록 코드를 변경해야 할 것 같은 두 개의 열이있는, ... 또한
내 코드를 단순화 이것을 파악해야 :
<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;
}
}