2013-07-02 44 views
0

這已被問到各地,但我得到一個問題,我沒有看到任何其他地方,我不知道是什麼原因或如何解決它。該問題涉及按列排序GridView;我在網上找到的代碼Sorting方法沒有奏效。以下是我有:排序GridView綁定到數據集,DataTable null上強制轉換?

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     // Initial DataBind() 
     BindGrid(); 
    } 
    // Add dynamically created controls manually each time 
    AddDropDowns(); 
} 

protected void MainGrid_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    // This DataBind() may be redundant 
    // Removing it didn't fix anything though. 
    BindGrid(); 
    DataTable dataTable = MainGrid.DataSource as DataTable; 
    // This block is never being entered, dataTable is always null 
    if (dataTable != null) 
    { 
     DataView dataView = new DataView(dataTable); 
     dataView.Sort = e.SortExpression + " " + "ASC"; 
     MainGrid.DataSource = dataView; 
     MainGrid.DataBind(); 
    }    
} 

public void BindGrid() 
{ 
    // Prep the datasource for binding with fresh search results 
    BuildSearch(); 
    // And bind it 
    MainGrid.DataSource = SearchResults.Products; 
    MainGrid.DataBind(); 
} 

的問題是,執行實際排序(如上所示),該塊從未被進入,因爲dataTable總是在那張支票無效。我想這是因爲MainGrid.DataSource(這是一個DataSet)也是空的,但是當我在調試過程中檢查它時,很讓我驚訝的是MainGrid.DataSource而不是 null。爲什麼要使用as來製作dataTable null?爲什麼沒有其他人使用這種方法有這個問題? (我發現這個代碼在asp.net論壇上幾乎完全相同的用例)

我非常難以忍受這一點,我覺得它應該是如此簡單。任何幫助表示讚賞,包括一般的ASP.net幫助,因爲我是一個非常新的框架。如果有人需要更多信息/代碼,請告訴我,我很樂意更新這篇文章。

編輯:已解決:要解決此問題,我將實現從DataSet切換到DataTable,代碼看起來幾乎完全相同,它是項目中其他地方發生更改的聲明。

回答

0

它很難從代碼片段中找到爲什麼它是NULL,根據我的知識 但我可以給你的想法,當你綁定你的數據表gridview時,把數據表視爲狀態或會話中更好放入視圖狀態,然後在排序時檢索數據表

0

HTTP是無狀態的。 ASP.NET只是增加了一個抽象,使其看起來有狀態。

回發到來時 - 舊的網格和數據表/數據集對象不見了。這是一個新鮮的請求,在新鮮的頁面對象的新線程上。

網格通過它自己的內部數據結構(以及一些viewstate接線...)維護它的內部狀態 - 它在回發時不會是相同的數據表,或者甚至不會在數據表中使用相同的數據表。

您當前的工作方式,您需要重新獲取其需要排序的數據表,無論是從那裏你從頭開始或從緩存中構建它(如果它是微小,甚至會話中的DB /碼/ viewstate?)

+0

好的,這是有道理的,我認爲你是對的,我的問題的來源涉及到這一點,但Sorting事件的第一件事是用BindGrid()重新綁定GridView。這不足以重新填充GridView進行排序嗎? – akowalz