【问题标题】:ASP Gridview paging and cachingASP Gridview 分页和缓存
【发布时间】:2015-10-06 18:47:16
【问题描述】:

我想使用分页并缓存某些页面更改时的搜索结果。 我有一个交易页面,默认加载最新的 100 笔交易。 但是,用户可以单击“搜索”链接,该链接将显示搜索条件,页面将检索该特定数据集。

我在我的 GridView 中添加了分页,它会根据页面大小字段显示正确的页数。

我的挑战是在用户单击页码后检索 GridView 页面的数据集。该页面默认加载或通过用户搜索加载。显示网格。现在,比如说,用户想要转到第二页。我该如何处理?

这是我尝试过的:

页面加载函数调用下面的 Populate() 。 我添加了一个 DataSet 全局变量 pagingQuery 来保存我的搜索条件。在 populate() 中,我将 pagingQuery 设置为我从数据库中检索到的内容。然而,在页面加载后这个变量被设置为空!!为什么? 在 PageIndexChanging() 我只是做

     protected void GridView1_PageIndexChanging(object sender,GridViewPageEventArgs e)
    {

        GridView1.PageIndex = e.NewPageIndex;
        //Populate();
        GridView1.DataSource = pagingQuery;
        GridView1.DataBind();
    }

   public void Populate()
    {
        try
        {
            Transaction tran = new Transaction();

            //DataSet ds = tran.GetAllBankTransactions(); 
            pagingQuery = tran.GetAllBankTransactions();
            GridView1.DataSource = pagingQuery;
            GridView1.DataBind();
        }
        catch{
        }
    }

对于搜索条件,采用了类似的方法,但无济于事。该值为 null 并且任何后续页面为空。 我可以通过使用局部变量 DataSet ds 再次调用 populate() 来让分页工作,但是我不能对搜索做同样的事情 因为为搜索条件保存一个全局值失败得很惨。我可以保存搜索文本并再次调用数据库,但似乎无法存储全局变量。
我的方法准确吗? 有没有办法在 pageIndexChanging() 调用之间保存数据集/字符串/变量?

    protected void Search_button_click(object sender, EventArgs e)
    {
        try
        {
            ....
            else if (ddSearhField.SelectedValue == "Bank" && ddSearchFieldValue.SelectedValue != "All Banks")
            {
                pagingQuery  = trans.GetAllBankTransactionsByBank(Convert.ToInt64(ddSearchFieldValue.SelectedValue), strFromDate, strToDate, showAllFields);
                GridView1.DataSource = pagingQuery;
                GridView1.DataBind();

                lblHeading.Text = ddSearchFieldValue.SelectedItem.Text;
            }
            ...

        }
    }

【问题讨论】:

    标签: c# asp.net caching gridview pagination


    【解决方案1】:

    尝试将数据源保存在会话中,然后加载到 Page_Load 部分。 我通常将gridview的选择命令存储在会话中。 示例:

    DS_GRIDVIEW1.SelectCommand = myquery;
    GRIDVIEW1.DataBind();
    Session["myquery"] = DS_MCV.SelectCommand.ToString();
    

    然后在页面加载

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["myquery"]!= null)
        {
            try
            {
                DS_GRIDVIEW1.SelectCommand = Session["myquery"].ToString();
                GRIDVIEW1.DataBind();
            }
            catch (Exception)
            {
                Session["myquery"] = null;    
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      @Robert Mattea,谢谢,这就是诀窍。我没有想到。

      我在 Page_Load() 中所做的我查看会话是否仍然具有该变量 pagingQuery,如果没有,我将其添加到会话中。

             protected void Page_Load(object sender, EventArgs e)
          {
              try
              {
                  if (Session["IsValidUser"] == null || Session["IsValidUser"].ToString() != "true")
                      Response.Redirect("Login.aspx", false);
      
                  /// Setting the Body tag. 
                  Site1 m = (Site1)Master;
                  m.PageSection = "transactions";
      
                  //AH setup the pagingQuery variable to cache where we are. 
                  if (Session["pagingQuery"] == null) 
                  {
                      Session.Add("pagingQuery", null);
                  }
      
                  if (!IsPostBack)
                  {
                      Populate();
                  }
                  /////////////////////////////
                  user = (User)Session["user"];
      
              }
              catch (Exception ex)
              {
                  Response.Redirect("Login.aspx");
              }        
          }
      

      在检索默认前 100 名的 Populate() 函数和 Search_button_click() 中,我将变量设置为查询

          public void Populate()
          {
              try
              {
                  Transaction tran = new Transaction();
      
                 // DataSet ds = tran.GetAllBankTransactions();
                  //AH: set the variable 
                  Session["pagingQuery"] = tran.GetAllBankTransactions();
                  GridView1.DataSource= (DataSet)Session["pagingQuery"];
                  GridView1.DataBind();
                  ..........
              }
          }
      

          protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
             {
      
              GridView1.PageIndex = e.NewPageIndex;
              //AH get the data set used to retrieve the query  default page load or search criteria
              GridView1.DataSource = (DataSet)Session["pagingQuery"];
              GridView1.DataBind();
      
          }
      

      它就像一个魅力。


      再想一想。通过在会话中缓冲 DataSet,我添加到内存堆有多糟糕?数据集可以是 100 或 5K 条记录,但大多在几百条记录的范围内,每条记录大约 1Kb。

      【讨论】:

        猜你喜欢
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-11
        • 1970-01-01
        • 2018-11-09
        相关资源
        最近更新 更多