[研究] 由 GridView 'GridView1' 引發但尚未處理的事件 PageIndexChanging。
2018-11-01
環境:Visual Studio 2017 v15.8.8
程式架構:WebForm
********************************************************************************
原因:
GridView 資料來源取得有2種方式:一種是透過 DataSourceID, 另一種則是 DataSource,只能選擇一種。
DataSourceID能指定給 SqlDataSouce,AccessDataSource, ObjectDataSource, XmlDataSource 等。
DataSource能設定為 DataSet , DataView , DataTable...,或是任何有實作 IEnumerable, IListSource, IDataSource, IHierarchicalDatasource介面。
GridView 預設的 Sort 功能只支援 DataSoruceID 屬性,不支援 DataSource。
如果設定為 DataSource,就算 GridView 有設定 AllowSorting="True"
BoundField 也設定了 SortExpression
<asp:BoundField DataField="欄位名稱" HeaderText="欄位顯示名稱" SortExpression="欄位名稱" />
網頁上顯示的 GridView1 的標題欄位名稱下方有超連結可點選排序,但是點了就會出現上面錯誤。
********************************************************************************
解法:使用 Cache 或 Session,並
在 GridView1_Sorting() 事件中,去判斷它要排序的欄位/遞增或遞減,再自行去設定 DataTable.DefaultView.Sort,重新做一次 DataBind。
在 GridView1_Sorting() 事件中,去判斷它要排序的欄位/遞增或遞減,再自行去設定 DataTable.DefaultView.Sort,重新做一次 DataBind。
參考這篇
GridView.Sorting Event
https://docs.microsoft.com/zh-tw/dotnet/api/system.web.ui.webcontrols.gridview.sorting?view=netframework-4.7.2
和 這篇
Page.Cache Property
https://docs.microsoft.com/zh-tw/dotnet/api/system.web.ui.page.cache?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-TW%26k%3Dk(System.Web.UI.Page.Cache);k(TargetFrameworkMoniker-.NETFramework,Version%3Dv4.7.1);k(DevLang-csharp)%26rd%3Dtrue&view=netframework-4.7.2
protected void Button_Query_Click(object sender, EventArgs e) { ...(略) // Session["TaskTable"] = dt; // 把 DataTable 放入 Session this.Cache["cachedt"] = dt; // 把 DataTable 放入 Cache GridView1.DataSource = dt; GridView1.DataBind(); ..(略) } protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) { // DataTable dt = Session["TaskTable"] as DataTable; // 把 Session 資料讀取出來 DataTable dt = this.Cache["cachedt"] as DataTable; ; // 把 Cache 資料讀取出來 if (dt != null) { //Sort the data. dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression); GridView1.DataSource = dt; GridView1.DataBind(); } } private string GetSortDirection(string column) { // By default, set the sort direction to ascending. string sortDirection = "ASC"; // Retrieve the last column that was sorted. string sortExpression = ViewState["SortExpression"] as string; if (sortExpression != null) { // Check if the same column is being sorted. // Otherwise, the default value can be returned. if (sortExpression == column) { string lastDirection = ViewState["SortDirection"] as string; if ((lastDirection != null) && (lastDirection == "ASC")) { sortDirection = "DESC"; } } } // Save new values in ViewState. ViewState["SortDirection"] = sortDirection; ViewState["SortExpression"] = column; return sortDirection; } |
2015年06月05日 09:34:08 這篇文章主要介紹了ASP.NET中Session和Cache的區別總結,本文結合使用經驗,總結出了5點Session緩存和Cache緩存的區別,需要的朋友可以參考下 以前實現數據的緩存有很多種方法,有客戶端的Cookie,有服務器端的Session和Application。其中Cookie是保存在客戶端的一組數據,主要用來保存用戶名等個人信息。Session則保存對話信息。Application則是保存在整個應用程序範圍內的信息,相當於全局變量。通常使用最頻繁的是Session,那麼Session和Cache又有什麼區別呢? 本節結合使用經驗,詳細介紹Session緩存和Cache緩存的區別。 (1)最大的區別是Cache提供緩存依賴來更新數據,而Session只能依靠定義的緩存時間來判斷緩存數據是否有效。 (2)即使應用程序終止,只要Cache.Add方法中定義的緩存時間未過期,下次開啟應用程序時,緩存的數據依然存在。而Session緩存只是存在於一次會話中,會話結束後,數據也就失效了。 (3)Session容易丟失,導致數據的不確定性,而Cache不會出現這種情況。 (4)由於Session是每次會話就被加載,所以不適宜存放大量信息,否則會導致服務器的性能降低。而Cache則主要用來保存大容量信息,如數據庫中的多個表。 (5)VS2005的測試版提供了將緩存保存在硬盤上的參數,但正式版中取消了這個功能,估計其在以後版本中會重新實現。而Session目前只能保存在內存中,對其性能有影響。 https://www.jb51.net/article/67289.htm |
注意:AllowSorting="True" 和 SortExpression 仍是要設定。
注意:Cache 和 Session 的名稱,不要和別的網頁的使用的相同。
[ASP.NET]ViewState、Session、Cookies、Application State比較
https://dotblogs.com.tw/hatelove/2009/06/28/viewstate-session-cache-cookies-application-of-user-state
********************************************************************************
[研究] 由 GridView 'GridView1' 引發但尚未處理的事件 PageIndexChanging。
2018-11-02
解決方法
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { // DataTable dt = Session["TaskTable"] as DataTable; // 把 Session 資料讀取出來 DataTable dt = this.Cache["cachedt"] as DataTable; ; // 把 Cache 資料讀取出來 GridView1.DataSource = dt; GridView1.PageIndex = e.NewPageIndex; GridView1.DataBind(); } |
(完)
沒有留言:
張貼留言