2012-08-28 5 views
2

내 페이지에 간단한 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; 
    } 
} 

답변

1

다른 두 가지 답변을 통해 문제를 해결했습니다.

내 솔루션 :

public partial class TestPage1 : Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      ViewState["Data"] = MyUser.GetUsers(); 
      ViewState["SortExpression"] = "Name"; 
      DisplayData("Name", SortDirection.Ascending); 
     } 
    } 

    private void DisplayData(string sortExpression, SortDirection sortDirection) 
    { 
     Func<MyUser, object> f; 
     if (sortExpression == "Name") f = u => u.Name; 
     else f = u => u.BirthDate; 

     if (sortDirection == SortDirection.Ascending) 
     { 
      dgvView.DataSource = ((IEnumerable<MyUser>)ViewState["Data"]).OrderBy(f).ToList(); 
     } 
     else 
     { 
      dgvView.DataSource = ((IEnumerable<MyUser>)ViewState["Data"]).OrderByDescending(f).ToList(); 
     } 

     dgvView.DataBind(); 
    } 

    protected void DgvViewPageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     dgvView.PageIndex = e.NewPageIndex; 

     string sortExpression = ViewState["SortExpression"].ToString(); 
     DisplayData(sortExpression, GetDefaultSortDirection(sortExpression)); 
    } 

    protected void OnSort(object sender, GridViewSortEventArgs e) 
    { 
     ViewState["SortExpression"] = e.SortExpression; 
     ViewState[e.SortExpression] = GetReverseSortDirection(e.SortExpression); 
     DisplayData(e.SortExpression, (SortDirection)ViewState[e.SortExpression]); 
    } 

    private SortDirection GetDefaultSortDirection(string sortExpression) 
    { 
     if (ViewState[sortExpression] == null) 
     { 
      ViewState[sortExpression] = SortDirection.Ascending; 
     } 

     return (SortDirection)ViewState[sortExpression]; 
    } 

    private SortDirection GetReverseSortDirection(string sortExpression) 
    { 
     if (ViewState[sortExpression] == null) 
     { 
      ViewState[sortExpression] = SortDirection.Descending; 
     } 
     else 
     { 
      ViewState[sortExpression] = (SortDirection) ViewState[sortExpression] == SortDirection.Descending ? SortDirection.Ascending : SortDirection.Descending; 
     } 

     return (SortDirection)ViewState[sortExpression]; 
    } 
} 
2

당신은 당신의 데이터를 유지하기 위해 ViewState를 사용해야합니다

public string SortVariable 
{ 
    get 
    { 
     if(ViewState["YourKey"] == null) 
      return string.Empty; 
     return (string)ViewState["YourKey"]; 
     } 
    set 
    { 
     ViewState["YourKey"] = value; 
    } 
} 

페이지를 변경할 때이 솔루션을 사용하면 정렬하기 전에 viewstate에서 인덱스 정렬을 얻게됩니다. 당신이 해고 SortCommand 당신이 viewstate가의 값이

같은 페이지에 있기 때문에 당신이 세션을 필요로하지 않는 설명 설정해야하는 경우

, 당신은 이동하지 않는다

protected void OnSort(object sender, GridViewSortEventArgs e) 
    { 

     //Here you set your value SortVariable 
     SortVariable = e.SortExpression; 
     ... 
    } 

그리고 디스플레이 데이터

를의

당신은 치료 DataView를을 만들고 분류

private void DisplayData() 
    { 
      //GetSortVariable 
      //before bind with dataview you sort 
    } 
1

ISS의 UE는 당신이 DisplayData() 메서드를 호출 할 때 당신은 비 정렬 된 새로운 데이터 그리드를 결합

protected void DgvViewPageIndexChanging(object sender, GridViewPageEventArgs e) 
{ 
    dgvView.PageIndex = e.NewPageIndex; 
    DisplayData(); 
} 

에 있습니다. datatables 또는 jQGrid를 사용하지 않는 이유를 Asp.Net 4를 사용하는 경우가 Viewstate에서 매개 변수를 정렬 저장

(세션이 쓸모입니다)?

관련 문제