【问题标题】:Missing sorting when changed page in C#在 C# 中更改页面时缺少排序
【发布时间】:2014-05-27 06:29:49
【问题描述】:

我需要对 GridView 中的一列进行排序,这很有效,但是当我在 GridView 中更改页面时出现问题,因为缺少排序,您能帮帮我吗?

下面是我的代码 C#,用于在 GridView 中对列进行排序,在此先感谢。

public SortDirection dir
{
    get
    {
        if (ViewState["dirState"] == null)
        {
            ViewState["dirState"] = SortDirection.Ascending;
        }
        return (SortDirection)ViewState["dirState"];
    }
    set
    {
        ViewState["dirState"] = value;
    }
}

protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
{
    sortingDirection = string.Empty;
    if (dir == SortDirection.Ascending)
    {
        dir = SortDirection.Descending;
        sortingDirection = "Desc";
    }
    else
    {
        dir = SortDirection.Ascending;
        sortingDirection = "Asc";
    }

    DataView sortedView = new DataView(GridViewBind());
    sortedView.Sort = e.SortExpression + " " + sortingDirection;
    PleaseWait();
    GridView1.DataSource = sortedView;
    GridView1.DataBind();
}


public DataTable GridViewBind()
{

sql1 = " SELECT * FROM `tbl` ORDER BY empid DESC; ";

dadapter = new OdbcDataAdapter(sql1, myConnectionString);
dset = new DataSet();
dset.Clear();
dadapter.Fill(dset);
DataTable dt=dset.Tables[0];
GridView1.DataSource = dt;
GridView1.DataBind();
dadapter.Dispose();
dadapter = null;
myConnectionString.Close();
return dt;

}


protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    GridViewBind();
    GridView1.DataSource = dset.Tables[0];
    GridView1.PageIndex = e.NewPageIndex;
    GridView1.DataBind();
}



protected void ddlPages_SelectedIndexChanged(Object sender, EventArgs e)
{
    GridViewRow gvrPager = GridView1.BottomPagerRow;
    DropDownList ddlPages = (DropDownList)gvrPager.Cells[0].FindControl("ddlPages");

    GridViewBind();
    GridView1.DataSource = dset.Tables[0];
    GridView1.PageIndex = ddlPages.SelectedIndex;
    GridView1.DataBind();
}


protected void Paginate(object sender, CommandEventArgs e)
{
    int intCurIndex = GridView1.PageIndex;

    switch (e.CommandArgument.ToString().ToLower())
    {
        case "First":
            GridView1.PageIndex = 0;
            break;
        case "Prev":
            GridView1.PageIndex = intCurIndex - 1;
            break;
        case "Next":
            GridView1.PageIndex = intCurIndex + 1;
            break;
        case "Last":
            GridView1.PageIndex = GridView1.PageCount - 1;
            break;
    }

    GridView1.DataBind();
}


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Pager)
    {
        DropDownList ddl = (DropDownList)(e.Row.FindControl("ddlpages"));
        Label lblPageCount = (Label)e.Row.FindControl("lblPageCount");

        if (lblPageCount != null)
            lblPageCount.Text = GridView1.PageCount.ToString();

        for (int i = 1; i <= GridView1.PageCount; i++)
        {
            ddl.Items.Add(i.ToString());
        }

        ddl.SelectedIndex = GridView1.PageIndex;

        if (GridView1.PageIndex == 0)
        {
            ((ImageButton)e.Row.FindControl("ImageButton1")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton2")).Visible = false;
        }

        if (GridView1.PageIndex + 1 == GridView1.PageCount)
        {
            ((ImageButton)e.Row.FindControl("ImageButton3")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton4")).Visible = false;
        }
    }
}

编辑 1

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    sortingDirection = string.Empty;
    if (dir == SortDirection.Ascending)
    {
        dir = SortDirection.Descending;
        sortingDirection = "Desc";
    }
    else
    {
        dir = SortDirection.Ascending;
        sortingDirection = "Asc";
    }

    DataView sortedView = new DataView(GridViewBind());
    sortedView.Sort = e.SortExpression + " " + sortingDirection; 
    PleaseWait();
    GridViewBind();
    GridView1.DataSource = dset.Tables[0];
    GridView1.PageIndex = e.NewPageIndex;
    GridView1.DataBind();
}

编辑 2

public SortDirection dir
{
    get
    {
        if (ViewState["dirState"] == null)
        {
            ViewState["dirState"] = SortDirection.Ascending;
        }
        return (SortDirection)ViewState["dirState"];
    }
    set
    {
        ViewState["dirState"] = value;
    }
}

    public string SortField
    {
        get
        {
            return (string)ViewState["SortField"] ?? "empid"; // default sort 
        }
        set
        {
            ViewState["SortField"] = value;
        }
    }

    protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        sortingDirection = string.Empty;
        if (dir == SortDirection.Ascending)
        {
            dir = SortDirection.Descending;
            sortingDirection = "Desc";
        }
        else
        {
            dir = SortDirection.Ascending;
            sortingDirection = "Asc";
        }

        DataView sortedView = new DataView(GridViewBind());
        sortedView.Sort = e.SortExpression + " " + sortingDirection;
        SortField = e.SortExpression;
        PleaseWait();
        GridView1.DataSource = sortedView;
        GridView1.DataBind();
    }


public DataTable GridViewBind()
{

sql1 = " SELECT * FROM `tbl` ORDER BY empid DESC; ";

dadapter = new OdbcDataAdapter(sql1, myConnectionString);
dset = new DataSet();
dset.Clear();
dadapter.Fill(dset);
DataTable dt=dset.Tables[0];
GridView1.DataSource = dt;
GridView1.DataBind();
dadapter.Dispose();
dadapter = null;
myConnectionString.Close();
return dt;

}


    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        sortingDirection = string.Empty;
        if (dir == SortDirection.Ascending)
        {
            dir = SortDirection.Descending;
            sortingDirection = "Desc";
        }
        else
        {
            dir = SortDirection.Ascending;
            sortingDirection = "Asc";
        }

        DataView sortedView = new DataView(GridViewBind());
        sortedView.Sort = SortField + " " + sortingDirection; 
        PleaseWait();
        GridViewBind();
        GridView1.DataSource = dset.Tables[0];
        GridView1.PageIndex = e.NewPageIndex;
        GridView1.DataBind();
    }


protected void ddlPages_SelectedIndexChanged(Object sender, EventArgs e)
{
    GridViewRow gvrPager = GridView1.BottomPagerRow;
    DropDownList ddlPages = (DropDownList)gvrPager.Cells[0].FindControl("ddlPages");

    GridViewBind();
    GridView1.DataSource = dset.Tables[0];
    GridView1.PageIndex = ddlPages.SelectedIndex;
    GridView1.DataBind();
}


protected void Paginate(object sender, CommandEventArgs e)
{
    int intCurIndex = GridView1.PageIndex;

    switch (e.CommandArgument.ToString().ToLower())
    {
        case "First":
            GridView1.PageIndex = 0;
            break;
        case "Prev":
            GridView1.PageIndex = intCurIndex - 1;
            break;
        case "Next":
            GridView1.PageIndex = intCurIndex + 1;
            break;
        case "Last":
            GridView1.PageIndex = GridView1.PageCount - 1;
            break;
    }

    GridView1.DataBind();
}


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.Pager)
    {
        DropDownList ddl = (DropDownList)(e.Row.FindControl("ddlpages"));
        Label lblPageCount = (Label)e.Row.FindControl("lblPageCount");

        if (lblPageCount != null)
            lblPageCount.Text = GridView1.PageCount.ToString();

        for (int i = 1; i <= GridView1.PageCount; i++)
        {
            ddl.Items.Add(i.ToString());
        }

        ddl.SelectedIndex = GridView1.PageIndex;

        if (GridView1.PageIndex == 0)
        {
            ((ImageButton)e.Row.FindControl("ImageButton1")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton2")).Visible = false;
        }

        if (GridView1.PageIndex + 1 == GridView1.PageCount)
        {
            ((ImageButton)e.Row.FindControl("ImageButton3")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton4")).Visible = false;
        }
    }
}

编辑 3

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    sortingDirection = string.Empty;
    if (dir == SortDirection.Ascending)
    {
        dir = SortDirection.Descending;
        sortingDirection = "Desc";
    }
    else
    {
        dir = SortDirection.Ascending;
        sortingDirection = "Asc";
    }

    DataView sortedView = new DataView(GridViewBind());
    sortedView.Sort = SortField + " " + sortingDirection; 
    PleaseWait();
    GridViewBind();
    GridView1.DataSource = sortedView;
    GridView1.PageIndex = e.NewPageIndex;
    GridView1.DataBind();
}

【问题讨论】:

  • 不是因为当您更改页面时,您只是在调用 GridViewBind(),当数据绑定时,没有像在 gridView_Sorting 中那样设置排序表达式
  • 感谢您的帮助 我已经使用新版本的 GridView1_PageIndexChanging 编辑了我的第一篇文章,但我出错了:编译器错误消息:CS1061:'System.Web. UI.WebControls.GridViewPageEventArgs'不包含'SortExpression'的定义

标签: c# asp.net sorting gridview


【解决方案1】:

当 GridView1_PageIndexChanging() 正在执行时,您不对数据进行排序。要修复它,您需要在该方法中添加与 gridView_Sorting() 相同的代码,但让 GridView1.PageIndex

更新:

要记住排序字段,请添加一个新属性

public string SortField 
{
   get {
      return (string)ViewState["SortField"] ?? "empid"; // default sort 
   }
   set {
      ViewState["SortField"]=value;
   }
}

在排序事件gridView_Sorting()中设置为

SortField = e.SortExpression;

现在,在需要获取排序列的任何地方使用它,例如在 GridView1_PageIndexChanging()

//sortedView.Sort = e.SortExpression + " " + sortingDirection; 
sortedView.Sort = SortField + " " + sortingDirection; 

更新 2:

GridView1_PageIndexChanging方法中EDIT3还有2个问题

  1. 您绑定到错误的数据源
  2. 您将排序顺序更改为相反的方向

必须是

//sortingDirection = string.Empty;
if (dir == SortDirection.Ascending)
{
    //dir = SortDirection.Descending;
    sortingDirection = "Asc"; // "Desc";
}
else
{
    //dir = SortDirection.Ascending;
    sortingDirection = "Desc"; // "Asc";
}

...
GridView1.DataSource = sortedView; //dset.Tables[0];

这应该会有所帮助,但通常您的代码非常不足,您可能需要在互联网上寻找最佳实践示例。

【讨论】:

  • 感谢您的帮助 我已经使用新版本的 GridView1_PageIndexChanging 编辑了我的第一篇文章,但我出错了:编译器错误消息:CS1061:'System.Web. UI.WebControls.GridViewPageEventArgs'不包含'SortExpression'的定义
  • 谢谢。在 EDIT 2 中我的代码的新版本中,我没有错误但更改页面并丢失了排序。
  • 在 GridView1_PageIndexChanging() 中,您对 DataView (sortedView) 进行排序,但将网格绑定到不同的源 (dset.Tables[0])。应该是 GridView1.DataSource = sortedView;
  • 谢谢,我已将 GridView1_PageIndexChanging() 中的 GridView1.DataSource = dset.Tables[0]; 替换为 GridView1.DataSource = sortedView; 但是缺少更改页面和排序...
  • 为什么在GridView1_PageIndexChanging()中调用GridViewBind()?
猜你喜欢
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 2017-08-26
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多