2

ページに単純なグリッドビューを表示し、並べ替えとページング機能を提供したいと思います。個別の並べ替えとページングは​​問題なく機能しますが、両方の組み合わせは機能しません。たとえば、最初の列を降順で並べ替えてから2ページ目に移動すると、デフォルトの並べ替え(昇順)でデータの2番目のページが表示されます。

私はこの質問のコードに大きく依存しました:GridViewの並べ替え:SortDirectionは常に昇順ですが、問題は残ります。また、Sessionオブジェクトの代わりにViewStateが使用されるようにコードを変更する必要があるように思われるので、これも理解する必要があります...

私のコードは単純化されており、2つの列しかありません。

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

3 に答える 3

2

データを永続化するには、ViewState を使用する必要があります

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

このソリューションを使用すると、ページを変更すると、並べ替えの前にビューステートでインデックスの並べ替えが行われます。

SortCommand を起動するときは、説明されているビューステートの値を設定する必要があります

同じページにいるため、セッションは必要ありません。ナビゲートしません

 protected void OnSort(object sender, GridViewSortEventArgs e)
    {

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

そして表示データでは

データビューと並べ替え処理を作成します

private void DisplayData()
    {
            //GetSortVariable
            //before   bind with dataview you sort
    }
于 2012-08-28T13:13:49.417 に答える
1

他の2つの回答の助けを借りて解決しました。

私の解決策:

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];
    }
}
于 2012-08-28T20:50:14.170 に答える
1

問題はオンです

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

メソッドを呼び出すときに、並べ替えられていない真新しいデータでグリッドをバインドしますDisplayData()

ソートパラメータを保存しますViewstate(セッションはこれには役に立ちません)

使用している場合、 datatablesまたはjQGridAsp.Net 4を使用しないのはなぜですか?

于 2012-08-28T13:42:25.137 に答える