2

並べ替えが有効になっている GridView があります。単一ページの結果の場合、昇順と降順の両方が正常に機能します。ただし、複数のページがある場合は、降順だけでうまく機能します。昇順も機能しますが、次のページをクリックすると、再びソートされなくなります。問題の原因がソート方向なのかページングなのかわかりません。親切に助けてください。以下にコードを示します。

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView grid = sender as GridView;
    //Retrieve the table from the session object.
    DataTable dt = Session["List"] as DataTable;

    if (dt != null)
    {
        //Sort the data.
        dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
        grid.DataSource = Session["List"];
        grid.DataBind();
    }
}

private string GetSortDirection(string column)
{
    string sortDirection = "ASC";      
    string sortExpression = ViewState["SortExpression"] as string;
    if (sortExpression != null)
    {
        if (sortExpression == column)
        {
            string lastDirection = ViewState["SortDirection"] as string;
            if ((lastDirection != null) && (lastDirection == "ASC"))
            {
                sortDirection = "DESC";
            }
        }
    }
    // Save new values in ViewState.
    ViewState["SortDirection"] = sortDirection;
    ViewState["SortExpression"] = column;
    return sortDirection;
}

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    GridView1.PageIndex = e.NewPageIndex;
    GridView1.DataSource = bindGridView();
    GridView1.DataBind();
}
4

2 に答える 2

1

セッション変数を使用して最新の並べ替え式を格納し、次にグリッドを並べ替えるときに、グリッドの並べ替え式を最後の並べ替え式を格納するセッション変数と比較します。列が等しい場合は、前の並べ替えの方向を確認し、反対方向に並べ替えます。

DataTable sourceTable = GridAttendence.DataSource as DataTable;
DataView view = new DataView(sourceTable);
string[] sortData = Session["sortExpression"].ToString().Trim().Split(' ');
if (e.SortExpression == sortData[0])
 {
if (sortData[1] == "ASC")
{
    view.Sort = e.SortExpression + " " + "DESC";
    this.ViewState["sortExpression"] = e.SortExpression + " " + "DESC";
}
else
{
    view.Sort = e.SortExpression + " " + "ASC";
    this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
}
 }
 else
{
view.Sort = e.SortExpression + " " + "ASC";
this.ViewState["sortExpression"] = e.SortExpression + " " + "ASC";
 }
于 2014-02-19T08:55:57.640 に答える
0

非常に多くの調査の後、私は自分の質問に対する正しい答えを見つけました。これはおそらく将来誰かを助けるでしょう。次のコードを bindGridView() に追加します

if (ViewState["sortExpr"] != null)
{
     dv = new DataView(ds.Tables[0]);
     dv.Sort = (string)ViewState["sortExpr"];
}
else
    dv = ds.Tables[0].DefaultView;

#region Sorting
    protected void Gridview1_Sort(object sender, GridViewSortEventArgs e)
    {
        ViewState["sortExpr"] = e.SortExpression + " " + GetSortDirection(e.SortExpression); 
        Gridview1.DataSource = bindGridView();
        Gridview1.DataBind();
    }

    private string GetSortDirection(string column)
    {
        // By default, set the sort direction to ascending.
        string sortDirection = "ASC";

        // Retrieve the last column that was sorted.
        string sortExpression = ViewState["SortExpression"] as string;

        if (sortExpression != null)
        {
            // Check if the same column is being sorted.
            // Otherwise, the default value can be returned.
            if (sortExpression == column)
            {
                string lastDirection = ViewState["SortDirection"] as string;
                if ((lastDirection != null) && (lastDirection == "ASC"))
                {
                    sortDirection = "DESC";
                }
            }
        }
        // Save new values in ViewState.
        ViewState["SortDirection"] = sortDirection;
        ViewState["SortExpression"] = column;

        return sortDirection;
    }
    #endregion
于 2012-10-22T14:53:01.103 に答える