c# - GridView排序和分页

标签 c# asp.net sorting gridview pagination

我想在我的页面上显示简单的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/

相关文章:

java - 对优先队列中的这一行感到困惑

python - 编写一个快速函数来检查矩阵中的元素

c# - 如何配置多对一关系?

c# - IFormFile 拒绝 ASP.Net Core 访问路径

linux - 从值字符串中获取中位数

c# - 所以我真的不能在服务器端使用 Excel 对象模型吗?

asp.net - 如何用今天的日期 VB.Net 填充文本框类型的日期

c# - System.Web.Helpers.Json.Deserialize() maxJsonLength 被忽略

c# - XAML - 在 DataGrid 的不同行上同步相同的动画

c# - 获取 linq 列表中对象的百分比并将其映射到 JSON 的最佳方法是什么?