2009-03-31 41 views
28

Tôi đang cố gắng để có được một GridView để sắp xếp và trang thủ công mà không thành công.phân loại và phân trang với GridView asp.net

Vấn đề là khi người dùng nhấp vào cột họ muốn sắp xếp, nó sắp xếp trang đó, nhưng không sắp xếp nguồn dữ liệu (dataview) phía sau GridView. Vì vậy, khi họ tiến tới một trang khác, sắp xếp của họ bị mất. Khá nhiều Tôi đang tìm kiếm một loại mà thực sự sẽ sắp xếp các nguồn dữ liệu đằng sau GridView. Dưới đây là những gì tôi có cho đến thời điểm này:

protected void GridView_OnSort(object sender, GridViewSortEventArgs e) 
    { 
     String sortExpression = e.SortExpression; 

     if (GridViewSortDirection == SortDirection.Ascending) 
     { 
      DataView myDataView = new DataView(mybll.GetItemsOrdered()); 
      myDataView.Sort = sortExpression + " DESC"; 
      GridView.DataSource = myDataView; 
      GridView.DataBind(); 
     } 
     else 
     { 
      DataView myDataView = new DataView(mybll.GetItemsOrdered()); 
      myDataView.Sort = sortExpression + " ASC"; 
      GridView.DataSource = myDataView; 
      GridView.DataBind(); 
     } 
    } 

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn.

+0

Đây là bài viết về trình đọc phân loại của GridView, hãy tham khảo http://codepedia.info/2013/05/gridview-sorting-header-click/ –

Trả lời

51

Lưu thứ tự sắp xếp của bạn trong Chế độ xem.

private const string ASCENDING = " ASC"; 
private const string DESCENDING = " DESC"; 

public SortDirection GridViewSortDirection 
{ 
    get 
    { 
     if (ViewState["sortDirection"] == null) 
      ViewState["sortDirection"] = SortDirection.Ascending; 

     return (SortDirection) ViewState["sortDirection"];     
    } 
    set { ViewState["sortDirection"] = value; } 
} 

protected void GridView_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    string sortExpression = e.SortExpression; 

    if (GridViewSortDirection == SortDirection.Ascending) 
    { 
     GridViewSortDirection = SortDirection.Descending; 
     SortGridView(sortExpression, DESCENDING); 
    } 
    else 
    { 
     GridViewSortDirection = SortDirection.Ascending; 
     SortGridView(sortExpression, ASCENDING); 
    } 

} 

private void SortGridView(string sortExpression,string direction) 
{ 
    // You can cache the DataTable for improving performance 
    DataTable dt = GetData().Tables[0]; 

    DataView dv = new DataView(dt); 
    dv.Sort = sortExpression + direction;   

    GridView1.DataSource = dv; 
    GridView1.DataBind();   
} 

Tại sao bạn không muốn sử dụng chức năng sắp xếp hiện có? Bạn luôn có thể tùy chỉnh nó.

Sorting Data in a GridView Web Server Control tại MSDN

Dưới đây là một ví dụ với tùy biến:

http://www.netomatix.com/development/GridViewSorting.aspx

+0

Vì có các mục trong bảng mà tôi không muốn hiển thị trong Gridview, vì vậy tôi bỏ qua chúng trước khi đi qua bàn để các nguồn dữ liệu ... Và tôi đã cố gắng nhưng nó sắp xếp nó theo cột ban đầu khi tải, nhưng f ollowing các trang, giữ cho rằng phân loại, nhưng chỉ được sắp xếp theo cột mới – dangerisgo

+0

Nice trả lời Tarkus – Karamafrooz

5
<asp:GridView 
    ID="GridView1" runat="server" AutoGenerateColumns="false" AllowSorting="True" onsorting="GridView1_Sorting" EnableViewState="true"> 
    <Columns> 
     <asp:BoundField DataField="bookid" HeaderText="BOOK ID"SortExpression="bookid" /> 
     <asp:BoundField DataField="bookname" HeaderText="BOOK NAME" /> 
     <asp:BoundField DataField="writer" HeaderText="WRITER" /> 
     <asp:BoundField DataField="totalbook" HeaderText="TOTALBOOK" SortExpression="totalbook" /> 
     <asp:BoundField DataField="availablebook" HeaderText="AVAILABLE BOOK" /> 
    </Columns> 
</asp:GridView> 

Mã đằng sau:

protected void Page_Load(object sender, EventArgs e) { 
     if (!IsPostBack) { 
      string query = "SELECT * FROM book"; 
      DataTable DT = new DataTable(); 
      SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon); 
      DA.Fill(DT); 

      GridView1.DataSource = DT; 
      GridView1.DataBind(); 
     } 
    } 

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) { 

     string query = "SELECT * FROM book"; 
     DataTable DT = new DataTable(); 
     SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon); 
     DA.Fill(DT); 

     GridView1.DataSource = DT; 
     GridView1.DataBind(); 

     if (DT != null) { 
      DataView dataView = new DataView(DT); 
      dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection); 

      GridView1.DataSource = dataView; 
      GridView1.DataBind(); 
     } 
    } 

    private string GridViewSortDirection { 
     get { return ViewState["SortDirection"] as string ?? "DESC"; } 
     set { ViewState["SortDirection"] = value; } 
    } 

    private string ConvertSortDirectionToSql(SortDirection sortDirection) { 
     switch (GridViewSortDirection) { 
      case "ASC": 
       GridViewSortDirection = "DESC"; 
       break; 

      case "DESC": 
       GridViewSortDirection = "ASC"; 
       break; 
     } 

     return GridViewSortDirection; 
    } 
} 
0

Tôi tìm thấy một cách dễ dàng hơn nhiều, cho phép bạn vẫn sử dụng tính năng phân loại/phân trang được tạo sẵn e gridview standard ...

tạo 2 nhãn. đặt chúng thành hiển thị = false. Tôi gọi tôi lblSort1 và lblSortDirection1

sau đó mã 2 sự kiện đơn giản ... việc phân loại trang, trong đó ghi vào nội dung của nhãn ẩn danh, và sự thay đổi chỉ số trang, trong đó sử dụng chúng ...

Private Sub gridview_Sorting(sender As Object, e As GridViewSortEventArgs) Handles gridview.Sorting 
lblSort1.Text = e.SortExpression 
lblSortDirection1.Text = e.SortDirection 
End Sub 

Private Sub gridview_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridview.PageIndexChanging 
    gridview.Sort(lblSort1.Text, CInt(lblSortDirection1.Text)) 
End Sub 

này là một chút sloppier so với sử dụng các biến toàn cục, nhưng tôi đã tìm thấy với asp đặc biệt là vars toàn cầu là, tốt, không đáng tin cậy ...

0

Nhiều cách đơn giản ...:

Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable) 
    Dim dv As New DataView(dt) 

    If GridView1.Attributes("dir") = SortDirection.Ascending Then 
     dv.Sort = e.SortExpression & " DESC" 
     GridView1.Attributes("dir") = SortDirection.Descending 

    Else 
     GridView1.Attributes("dir") = SortDirection.Ascending 
     dv.Sort = e.SortExpression & " ASC" 

    End If 

    GridView1.DataSource = dv 
    GridView1.DataBind() 
0

Tar Câu trả lời của kus hoạt động tốt. Tuy nhiên, tôi sẽ đề nghị thay thế VIEWSTATE bằng SESSION.

VIEWSTATE của trang hiện tại chỉ hoạt động khi trang hiện tại đăng lại chính nó và biến mất khi người dùng được chuyển hướng đến trang khác. SESSION vẫn tiếp tục thứ tự sắp xếp trên không chỉ là bài đăng của trang hiện tại. Nó vẫn tồn tại trong toàn bộ thời gian của phiên. Điều này có nghĩa là người dùng có thể lướt qua các trang khác và khi quay lại trang đã cho, thứ tự sắp xếp mà anh ta sử dụng lần cuối vẫn còn. Điều này thường thuận tiện hơn.

Còn có các phương pháp khác, chẳng hạn như duy trì hồ sơ người dùng.

Tôi khuyên bạn nên bài viết này cho một lời giải thích rất tốt của ViewState và làm thế nào nó hoạt động với chu kỳ cuộc sống của một trang web: https://msdn.microsoft.com/en-us/library/ms972976.aspx

Để hiểu sự khác biệt giữa ViewState, PHIÊN và những cách khác của sự bền bỉ biến, tôi khuyên bạn nên bài viết này : https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx

Các vấn đề liên quan