我想使用分页并在某些页面更改时缓存搜索结果。 我有一个交易页面,默认情况下加载最新的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;
}
...
}
}
答案 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。