2015-10-06 4 views
0

Я хочу использовать Pagination и кэшировать результат поиска, когда некоторые страницы меняются. У меня есть страница транзакции, которая по умолчанию загружает 100 последних транзакций. Однако пользователь может нажать ссылку «Поиск», которая отобразит критерии поиска, и страница будет извлекать этот конкретный набор данных.ASP.NET 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{ 
     } 
    } 

Для критериев поиска следует подобный подход, но безрезультатно. Значение равно null, и любая последующая страница пуста. Мне удалось получить Pagination для работы, снова вызвав populate() с локальной переменной DataSet ds, однако я не могу сделать то же самое для поиска , поскольку сохранение глобального значения для критериев поиска терпит неудачу. Я мог бы сохранить текст поиска и снова вызвать db, но я не могу хранить глобальную переменную.
Является ли мой подход точным? Есть ли способ сохранить DataSet/строку/переменную между вызовами 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; 
      } 
      ... 

     } 
    } 

ответ

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

В обоих функция Populate(), который извлекает вершину 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

Try, чтобы сохранить источник данных в сессии затем загрузить в разделе Page_Load. Обычно я храню в сеансе команду select 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;  
     } 

    } 

} 
Смежные вопросы