2018年11月1日 星期四

[研究] 由 GridView 'GridView1' 引發但尚未處理的事件 Sorting 或 PageIndexChanging 。

[研究] 由 GridView 'GridView1' 引發但尚未處理的事件 Sorting。
[研究] 由 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。


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






ASP.NET中Session和Cache的區別總結

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

(完)

沒有留言:

張貼留言