2015-10-06 118 views
0

我想使用分頁和緩存某些頁面更改時的搜索結果。 我有一個交易頁面默認加載最新的100筆交易。 但是,用戶可以單擊「搜索」鏈接,該鏈接將顯示搜索條件,頁面將檢索該特定數據集。ASP Gridview分頁和緩存

我爲我的GridView添加了分頁,並且它基於頁面大小字段顯示正確的頁數。

我的挑戰是在用戶點擊頁碼後檢索GridView頁面的數據集。該頁面默認或通過用戶搜索加載。網格顯示。現在,例如,用戶想要轉到第二頁。我如何處理?

這裏是我的嘗試:

頁面加載函數調用填充(),如下。 我添加了一個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{ 
     } 
    } 

對於搜索條件類似的方法之後,但無濟於事。該值爲空,並且後續頁面爲空。 我能夠通過調用populate()再次使用局部變量DataSet ds來獲得分頁工作,但是我不能對搜索 執行相同的操作,因爲爲搜索條件保存全局值失敗了。我可能會保存搜索文本並再次調用數據庫,但我無法存儲一個全局變量。
我的方法準確嗎? 有沒有辦法在pageIndexChanging()調用之間保存DataSet /字符串/變量?

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

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

1

嘗試保存數據源中的會話,然後在Page_Load中部分加載。 我通常在會話中存儲gridview的select命令。 實施例:

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

    } 

}