ASP Gridview分页和缓存

时间:2015-10-06 18:47:16

标签: c# asp.net caching gridview pagination

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

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

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

这是我试过的:

页面加载函数调用下面的Populate()。 我添加了一个DataSet全局变量pagingQuery来保存我的搜索条件。在populate()中,我将pagingQuery设置为我从db中检索的内容。但是,在页面加载后,此变量将设置为null!为什么? 在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(),我能够让Pagination工作,但我不能为搜索做同样的事情 因为为搜索标准保存全局值是失败的惨败。我可以保存搜索文本并再次调用数据库,但我似乎无法存储全局变量 我的方法准确吗? 有没有办法在pageIndexChanging()调用之间保存DataSet / string / variable?

    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;
            }
            ...

        }
    }

2 个答案:

答案 0 :(得分:1)

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

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

然后在Page Load

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;    
        }

    }

}

答案 1 :(得分:0)

@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。