使用 gridview asp.net 进行排序和分页

Posted

技术标签:

【中文标题】使用 gridview asp.net 进行排序和分页【英文标题】:sorting and paging with gridview asp.net 【发布时间】:2010-10-16 16:47:48 【问题描述】:

我正在尝试让 gridview 手动排序和分页,但没有成功。

问题在于,当用户单击他们想要排序的列时,它会对该页面进行排序,但不会对 gridview 后面的数据源(数据视图)进行排序。因此,当他们前进到不同的页面时,他们的排序就会丢失。几乎我正在寻找一种实际上会对gridview后面的数据源进行排序的排序。这是我目前所拥有的:

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();
        
    

任何帮助将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

将您的排序顺序保存在 ViewState 中。

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();         

为什么不想使用现有的排序功能?您可以随时自定义它。

Sorting Data in a GridView Web Server Control 在 MSDN 上

这是一个自定义示例:

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

【讨论】:

因为表格中有一些我不想在 Gridview 中显示的项目,所以我在将表格传递给数据源之前省略了它们......我已经尝试过了,但它按加载时的初始列,但后续页面保持该排序,但只是按新列排序【参考方案2】:
<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>

后面的代码:

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;
    

【讨论】:

【参考方案3】:

Tarkus 的回答效果很好。但是,我建议将 VIEWSTATE 替换为 SESSION。

当前页面的 VIEWSTATE 仅在当前页面回发到自身时有效,并且在用户被重定向到另一个页面后消失。 SESSION 不仅在当前页面的回发上保持排序顺序。它在整个会话期间持续存在。这意味着用户可以浏览其他页面,当他返回给定页面时,他上次使用的排序顺序仍然存在。这通常更方便。

还有其他方法,例如持久化用户配置文件。

我推荐这篇文章来很好地解释 ViewState 以及它如何与网页的生命周期一起工作:https://msdn.microsoft.com/en-us/library/ms972976.aspx

想了解VIEWSTATE、SESSION等变量持久化方式的区别,推荐这篇文章:https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx

【讨论】:

【参考方案4】:

我找到了一种更简单的方法,它允许您仍然使用标准 gridview 的内置排序/分页...

创建 2 个标签。将它们设置为可见 = false。我打电话给我的 lblSort1 和 lblSortDirection1

然后编写 2 个简单的事件……页面排序,写入不可见标签的文本,页面索引更改,使用它们……

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

这比使用全局变量有点草率,但我发现使用 asp 尤其是全局变量是不可靠的......

【讨论】:

【参考方案5】:

更简单的方法...:

    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()

【讨论】:

以上是关于使用 gridview asp.net 进行排序和分页的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ajax 在 ASP.NET MVC 中对 GridView 进行异步排序

asp.net中GridView怎样进行分页,编辑,删除操作

如何以编程方式在 ASP.NET 4.0 GridView 上启用分页和排序?

Asp.net中GridView使用详解(引)

asp.net VS2008 GridView 里面怎么排序

如何使用 asp.net 在 gridview 中突出显示搜索结果?