如何将会话变量正确用于分页和排序GridView?

时间:2011-07-13 16:46:34

标签: c# asp.net session gridview viewstate

我有一个带有几个 GridView 控件的ASP .NET页面,我正在实现排序和分页。

我正在使用会话变量来维护一个表示ViewState中GridView数据的给定页面的DataTable,如下所示:

protected void gv_Sorting(object sender, GridViewSortEventArgs e)
{
      // Session["Page"] represents the active page of the GridView 
      // when the Sorting event fires.
      DataTable dt = Session["Page"] as DataTable;

      if (dt != null)
      {       
           if (ViewState["SortDirection"] == null)
           {
                ViewState["SortDirection"] = "DESC";
           }

           string ViewState_SortDirection = ViewState["SortDirection"].ToString();

           for (int i = 0; i <= ((GridView)sender).Columns.Count - 1; i++)
           {
                if (e.SortExpression == ((GridView)sender).Columns[i].SortExpression)
                {
                     if (ViewState["SortDirection"].ToString() == "ASC")
                     {
                          e.SortDirection = SortDirection.Descending;
                          ((GridView)sender).Columns[i].HeaderText = ((GridView)sender).Columns[i].HeaderText + " ▼";
                          ViewState["SortDirection"] = "DESC";
                     }
                     else if (ViewState["SortDirection"].ToString() == "DESC")
                     {
                          e.SortDirection = SortDirection.Ascending;
                          ((GridView)sender).Columns[i].HeaderText = ((GridView)sender).Columns[i].HeaderText + " ▲";
                          ViewState["SortDirection"] = "ASC";
                     }
                }
           }

           DataView dv = new DataView(dt)
           {
                Sort = e.SortExpression + " " + ViewState["SortDirection"]
           };

           gv.DataSource = dv;
           gv.DataBind();

           Session["Page"] = dv.ToTable();
           DataTable dt = Session["Page"] as DataTable;
      }
 }

我想让每个GridView使用相同的排序事件处理程序。当状态包中的会话变量如 Session [“Page”] 正在使用时,此会话变量是否特定于其排序事件触发的GridView?或者它可以被其他GridView控件修改使用它在同一页面上排序?这意味着,如果我有另一个也使用Session [“Page”]进行分页的GridView,那个会话变量是否会在该控件的范围内?

或者,我是否应该跟随this post's answer的引导并且仅为每个会话传递SortDirection?

1 个答案:

答案 0 :(得分:3)

以下是可用的数据持久变量类型及其范围:

  • 应用程序变量(在所有用户会话之间共享,适用于整个应用程序)
  • 会话变量(在所有页面之间共享,用于整个用户会话)
  • ViewState变量(仅存在于页面上,适用于整个页面)
  • ControlState变量(仅存在于页面上,仅用于控件)

如果将网格数据存储为会话变量,则在同一页面中使用两个网格时会遇到问题。我不能在不了解系统的情况下提供有关如何存储数据的任何具体建议,但上述变量类型可能指向正确的方向