【问题标题】:How do I keep sorting order while paging in gridView?在gridView中分页时如何保持排序顺序?
【发布时间】:2013-08-13 16:00:16
【问题描述】:

我正在使用 gridView 显示信息。除了一个细节外,它对我来说绝对完美。如果用户对一列进行排序,然后单击以转到另一个页面,则排序将丢失。基本上我需要在分页发生时保持排序,任何帮助将不胜感激。这是我的代码:

public partial class DynamicGridView : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (_selectCmd != string.Empty)
            BindData();
    }

    private void BindData()
    {
        DataTable dt;
        if (ViewState[gridView.ClientID + "datatable"] == null || (string)ViewState[gridView.ClientID + "selectCommand"] != _selectCmd)
        {
            ViewState[gridView.ClientID + "selectCommand"] = _selectCmd;
            dt = Classes.SQL.GetDataTable(_selectCmd);

            if (dt != null)
            {
                ViewState[gridView.ClientID + "datatable"] = dt;
                if (dt.Columns.Count != gridView.Columns.Count)
                {
                    gridView.Columns.Clear();
                    foreach (DataColumn column in dt.Columns)
                        AddBoundField(column);
                }
            }
        }
        else
            dt = (DataTable)ViewState[gridView.ClientID + "datatable"];

        gridView.DataSource = dt;
        gridView.DataBind();
    }

    private void AddBoundField(DataColumn column)
    {
        BoundField field = new BoundField();
        HandleCustomDataFormatting(ref field, column);
        field.DataField = column.ColumnName;
        field.HeaderText = column.ColumnName;
        field.ReadOnly = true;
        field.SortExpression = column.ColumnName;
        field.ControlStyle.ForeColor = System.Drawing.ColorTranslator.FromHtml("#333333");
        field.ItemStyle.Width = System.Web.UI.WebControls.Unit.Pixel(70);

        gridView.Columns.Add(field);
    }

    private void HandleCustomDataFormatting(ref BoundField field, DataColumn column)
    {
        if (column.DataType == typeof(System.DateTime))
            switch (column.ColumnName)
            {
                case "InvalidDate":
                case "NewCustomerValidated":
                case "ValidatedDate":
                    field.DataFormatString = "{0:d}";//exclude time info
                    break;
                default:
                    field.DataFormatString = "{0:g}";
                    break;
            }
    }

    private string GetSortDirection(string sortColumn)
    {
        string sortDirection = "ASC";
        string lastSortColumn = (string)ViewState[gridView.ClientID + "SortExpression"];

        if (lastSortColumn != null && lastSortColumn == sortColumn)
        {
            string lastDirection = (string)ViewState[gridView.ClientID + "SortDirection"];
            if (lastDirection != null && lastDirection == "ASC")
                sortDirection = "DESC";
        }
        ViewState[gridView.ClientID + "SortExpression"] = sortColumn;
        ViewState[gridView.ClientID + "SortDirection"] = sortDirection;

        return sortDirection;
    }

    private string _selectCmd = string.Empty;

    public string SelectCommand
    {
        set { _selectCmd = value; }
    }

    protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dt = (DataTable)ViewState[gridView.ClientID + "datatable"];
        dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
        BindData();
    }

    protected void GridView_PageChange(object sender, GridViewPageEventArgs e)
    {
        gridView.PageIndex = e.NewPageIndex;
        BindData();
    }
}

【问题讨论】:

  • 您是否将DataTable 和sql 命令存储在ViewState 中?不要那样做。前者会炸毁 ViewState 从而减慢应用程序的速度,因为它会在客户端和服务器之间来回发送此视图状态。后者不安全,您是否希望每个用户都能够通过解码 ViewState 来查看您的 sql 查询?如果您需要将其持久化或从数据库重新加载,请使用Session
  • 另请注意,对于会生成大量数据的查询,您可能只需要从数据库中获取一页数据,然后在每次页面更改时去获取一个全新的页面,如果不是将整个结果集存储在Session 中很实用。
  • Tim,此应用程序仅供在本地 Intranet 上“内部”使用。此外,它会被少数人使用,所以我不太担心他们看到 SQL 查询。我同意你的观点,但你提出的所有观点。谢谢。

标签: c# sorting gridview ascx


【解决方案1】:

您无需在每次页面加载时进行绑定。

if (_selectCmd != string.Empty)
    if(!IsPostBack)
            BindData();

另外,请注意在 ViewState 中放置的内容,放置 sql 查询不是一个好习惯。

【讨论】:

    【解决方案2】:

    这种方法对我有用。

    您可以设置几个变量,如下所示:

    protected string SortColummn 
    {
        get { return ViewState["SortColumn"].ToString(); }
        set { ViewState["SortColumn"] = value; }
    }
    protected string SortDirection 
    {
        get { return ViewState["SortDirection"].ToString(); }
        set { ViewState["SortDirection"] = value; }
    }
    

    在“if (!Page.IsPostBack)”块的 Page_Load 中为这些设置默认值。然后,在 GridView_Sorting 中,根据 e.SortExpression 设置这两个变量。 最后,在 BindData() 中,根据这两个变量设置 dt.DefaultView.Sort。

    【讨论】:

    • 需要注意的是,上面关于使用 Session 与 ViewState 的 cmets 是准确的,但由于 Chris 表示他不担心这些问题,所以我使用 viewstate 编写了我的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 2012-09-20
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2016-05-23
    • 2023-01-07
    • 2018-06-04
    相关资源
    最近更新 更多