【问题标题】:Maintaining GridView current page index after navigating away from Gridview page离开 Gridview 页面后维护 GridView 当前页面索引
【发布时间】:2011-02-14 11:26:55
【问题描述】:

我在 ASP.NET Web 表单上有一个 GridView,我已将其绑定到数据源并将其设置为每页有 10 条记录。

我在 GridView 上还有一个超链接列,以便用户可以从列表导航到另一个页面(详细信息页面)。在详细信息页面上,他们有“返回”按钮返回到 GridView 页面

编辑
只是为了澄清查询

我正在寻找关于如何在数据绑定后指定页面索引以设置 GridView 的服务器端示例代码 sn-p。这样做的目的是确保用户导航到他们所在的同一页面索引。

【问题讨论】:

    标签: asp.net gridview


    【解决方案1】:

    三个基本选项供您使用:查询字符串、会话、cookie。它们各有优缺点:

    1. 使用查询字符串需要您格式化所有指向带有 gridview 的页面的链接,以便在查询字符串中包含正确的信息(最终可能不仅仅是页码)。
    2. 如果您确定每个浏览器实例都希望转到相同的gridview,则使用会话将起作用,否则您必须使用某个id 键标记会话变量,该键对于每个相关的gridview 页面都是唯一可识别的.这可能会导致对许多变量进行会话管理,这些变量可能完全不受欢迎,因为其中大多数变量只能在超时后过期。
    3. 使用 cookie 需要类似的东西,其中 cookie 数据存储在键/数据矩阵中(优化的哈希表可能适用于此)。不建议为您正在跟踪的每个 gridview 页面使用单独的 cookie 名称,而是使用具有通用名称的 cookie 来保存所有被跟踪且内部具有键/值结构的 gridview 页面的数据。

    编辑:设置页面索引的小代码sn-p。

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            try
            {
                if(HttpContext.Current.Request["myGVPageId"] != null])
                {
                    myGridview.PageIndex = Convert.ToInt32(HttpContext.Current.Request["myGVPageId"]);
                }
            }
            catch(Exception ex)
            {
                // log it
            }
        }
    }
    

    【讨论】:

    • 你忘记了 ViewState[]
    • @Fernando68:ViewState 仅在链接实际上没有离开页面时才有效。 OP 正在寻求一种可以单击链接的解决方案,并且当用户返回页面时应用相同的索引。 ViewState 不会做到这一点。
    • 如果 GridView 在 UpdatePanel 中,ViewState 就足够了,因为没有整体 PostBack。对不起,但这就是我让它为我工作的方式。我不想在 Session 的整个生命周期中保留数据。
    • @Fernando68:OP 明确声明目的是转到另一个页面,而不是 UpdatePanel。 such that a user can navigate to another page。虽然您的观点是正确的,但 ViewState 将适用于 UpdatePanel,这个问题明确要求退出当前页面。 ViewState 不允许这样做。
    【解决方案2】:

    就个人而言,我更喜欢 Session 方法。只需将您的页面索引保存为会话变量,如果此会话变量在页面加载时不为空,请使用它来触发您的“OnPageIndexChanging”方法,如下所示:

    每当页码更改时设置您当前的页码:

        protected void GridViewIndexChanging(object sender, GridViewPageEventArgs e)
        {
            myGridView.PageIndex = e.NewPageIndex;
            Session["pageNumber"] = e.NewPageIndex;
            //whatever your page index changing does...
        }
    

    然后,在 Page_Load 上执行以下操作:

            if (!IsPostBack)
            {
                if (Session["pageNumber"] != null)
                {
                    GridViewIndexChanged(myGridView, new GridViewPageEventArgs((int)Session["pageNumber"]));
                }
            }
    

    【讨论】:

      【解决方案3】:

      你可以使用Gridview的Page Index Change事件,找出e:g的当前页面索引

      yourGridId.PageIndex=e.NewPageIndex;
      ViewState["GridPageIndex"]=e.NewPageIndex;
      

      在PageLoad上获取Viewstate值

      string pIndex=string.Empty;
      pIndex=Convert.toInt32(ViewState["GridPageIndex"]);
      if(!string.Empty(pIndex))
      {
      yourGridId.PageIndex =pIndex;
      }
      

      【讨论】:

      • 在 Page_Load 上 ViewState["GridPageIndex"] 为空。如果您希望 PageIndex 在 Page_Load 上具有任何值,则应使用 Session["GridPageIndex"]
      【解决方案4】:

      您必须使用查询字符串并且推荐使用,否则您可以使用会话对象,但不要为此使用它,因为您可能在不同页面中打开网格视图,因此请使用查询字符串。

      gridView1.CurrentPageIndex = (Request["pageNo"] != null) ? Request["pageNo"] as int : 0; 
      gridView1.DataSource = myDataSet;
      gridView1.DataBind();
      

      您可以在GridView_DataBound 活动上更新您的链接

      【讨论】:

      • 我已经编辑了查询,我正在寻找关于如何在服务器端绑定GridView数据后设置页面索引的示例代码sn-p
      • PageIndex 不是 CurrentPageIndex
      猜你喜欢
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多