GridView的排序和放大器;分页 [英] GridView sorting & paging

查看:97
本文介绍了GridView的排序和放大器;分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要显示我的网页上简单的GridView和提供排序和分页功能吧。排序和分页单独工作不错,但两者的结合没有。例如,如果我排序的第一列下行,然后转到页二号,然后我看到数据的第二页用默认的排序(升序)。

我主要依靠从这个问题上的code:<一href=\"http://stackoverflow.com/questions/250037/gridview-sorting-sortdirection-always-ascending\">GridView排序:SortDirection总是升序,但问题仍然存在。此外 - 因为它似乎我不得不改变我的code,这样的会议,而不是使用对象的ViewState,也必须想出解决办法...

我的code,简化,只有两列:

ASPX:

 &LT; ASP:GridView控件ID =dgvView=服务器的AutoGenerateColumns =false的AllowPaging =真
    每页=10AllowSorting =真OnPageIndexChanging =DgvViewPageIndexChangingOnSorting =的onSort&GT;
    &LT;柱体和GT;
        &LT; ASP:BoundField的数据字段=名称的HeaderText =名称SORTEX pression =名称&GT;
            &LT; ItemStyle /&GT;
        &LT; / ASP:BoundField的&GT;
        &LT; ASP:BoundField的数据字段=出生日期的HeaderText =出生日期DataFormatString ={0:DD.MM.YYYY}
            SORTEX pression =出生日期&GT;
            &LT; ItemStyle /&GT;
        &LT; / ASP:BoundField的&GT;
    &LT; /专栏&GT;
&LT; / ASP:GridView的&GT;

和codebehind:

 公共部分类TestPage:页
{
    保护无效的Page_Load(对象发件人,EventArgs的发送)
    {
        如果(!的IsPostBack)
        {
            DisplayData();
        }
    }    私人无效DisplayData()
    {
        会议[的TableView] = GetUsers();
        dgvView.DataSource =会话[的TableView];
        dgvView.DataBind();
    }    保护无效DgvViewPageIndexChanging(对象发件人,GridViewPageEventArgs E)
    {
        dgvView.PageIndex = e.NewPageIndex;
        DisplayData();
    }    私人列表&LT;&MYUSER GT; GetUsers()
    {
        VAR用户=新的List&LT;&MYUSER GT;();
        的for(int i = 0; I&LT; 100;我++)
        {
            users.Add(新MYUSER(姓名+ i.ToString()PadLeft(2,'0'),新的日期时间(2000年,1,1).AddDays(I)));
        }
        回报用户;
    }    私有类MYUSER
    {
        公共字符串名称{;私人集; }
        公众的DateTime出生日期{搞定;私人集; }        公共MYUSER(字符串名称,日期生日)
        {
            名称=名称;
            出生日期=生日;
        }
    }    保护无效的onSort(对象发件人,GridViewSortEventArgs E)
    {
        FUNC&LT; MYUSER,对象&gt; F;
        如果(e.SortEx pression ==姓名),F = U =&GT; u.Name;
        否则F = U =&GT; u.BirthDate;        dgvView.DataSource =排序((名单&LT;&MYUSER GT;)会议[的TableView],女,GetSortDirection(e.SortEx pression));
        dgvView.DataBind();
    }    私人列表&LT;&MYUSER GT;排序&LT; T&GT;(IEnumerable的&LT;&MYUSER GT;的用户,Func键&LT; MYUSER,T&GT; F,SortDirection sortDirection)
    {
        如果(sortDirection == SortDirection.Ascending)返回user.OrderBy(F).ToList();
        返回user.OrderByDescending(F).ToList();
    }    私人SortDirection GetSortDirection(字符串列)
    {
        字符串sessionVariable =TableSort+列;
        SortDirection sortDirection;        如果(会话[sessionVariable] == NULL)
        {
            sortDirection = SortDirection.Ascending;
        }
        否则,如果((SortDirection)会话[sessionVariable] == SortDirection.Ascending)
        {
            sortDirection = SortDirection.Descending;
        }
        其他
        {
            sortDirection = SortDirection.Ascending;
        }        会话[sessionVariable] = sortDirection;
        返回sortDirection;
    }
}


解决方案

我和其他两个答案的帮助下解决了。

我的解决办法:

 公共部分类TestPage1:页
{
    保护无效的Page_Load(对象发件人,EventArgs的发送)
    {
        如果(!的IsPostBack)
        {
            的ViewState [数据] = MyUser.GetUsers();
            的ViewState [SORTEX pression] =名称;
            DisplayData(名,SortDirection.Ascending);
        }
    }    私人无效DisplayData(字符串SORTEX pression,SortDirection sortDirection)
    {
        FUNC&LT; MYUSER,对象&gt; F;
        如果(SORTEX pression ==姓名),F = U =&GT; u.Name;
        否则F = U =&GT; u.BirthDate;        如果(sortDirection == SortDirection.Ascending)
        {
            dgvView.DataSource =((IEnumerable的&LT;&MYUSER GT;)的ViewState [数据])排序依据(F).ToList()。
        }
        其他
        {
            dgvView.DataSource =((IEnumerable的&LT;&MYUSER GT;)的ViewState [数据])OrderByDescending(F).ToList()。
        }        dgvView.DataBind();
    }    保护无效DgvViewPageIndexChanging(对象发件人,GridViewPageEventArgs E)
    {
        dgvView.PageIndex = e.NewPageIndex;        字符串SORTEX pression =的ViewState [SORTEX pression]的ToString()。
        DisplayData(SORTEX pression,GetDefaultSortDirection(SORTEX pression));
    }    保护无效的onSort(对象发件人,GridViewSortEventArgs E)
    {
        的ViewState [SORTEX pression] = e.SortEx pression;
        的ViewState [e.SortEx pression] = GetReverseSortDirection(e.SortEx pression);
        DisplayData(e.SortEx pression,(SortDirection)的ViewState [e.SortEx pression]);
    }    私人SortDirection GetDefaultSortDirection(字符串SORTEX pression)
    {
        如果(的ViewState [SORTEX pression] == NULL)
        {
            的ViewState [SORTEX pression] = SortDirection.Ascending;
        }        回报(SortDirection)的ViewState [SORTEX pression]。
    }    私人SortDirection GetReverseSortDirection(字符串SORTEX pression)
    {
        如果(的ViewState [SORTEX pression] == NULL)
        {
            的ViewState [SORTEX pression] = SortDirection.Descending;
        }
        其他
        {
            的ViewState [SORTEX pression] =(SortDirection)的ViewState [SORTEX pression] == SortDirection.Descending? SortDirection.Ascending:SortDirection.Descending;
        }        回报(SortDirection)的ViewState [SORTEX pression]。
    }
}

I would like to display simple gridview on my page and provide sorting and paging functionality to it. Sorting and paging individually is working ok, but the combination of both does not. For example if I sort the first column descending and then go to page number two, then I see the second page of data with default sorting (ascending).

I relied heavily on the code from this question: GridView sorting: SortDirection always Ascending, but the problem remains. Also - as it seems I have to change my code so that instead of Session object ViewState is used, have to figure this out also...

My code, simplified, with only two columns:

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>

And codebehind:

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;
    }
}

解决方案

I solved it with the help of other two answers.

My solution:

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];
    }
}

这篇关于GridView的排序和放大器;分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆