2012-06-01 84 views
3

我正在分配DataTableViewStateViewState在更新DataTable時自動更新

public void Method1() 
{  
    DataTable dt = getData(); //Gets the Data 

    ViewState["dtThis"] = dt; 
} 

聯繫 '方法2' 執行的ViewState將被分配到的DataTable時。

public void Method2() 
{  
    DataTable dt2 = (DataTable)ViewState["dtThis"]; 

    dt2.Columns.Remove("FirstName"); //Removing a column 

    dt2.AcceptChanges(); 
} 

現在方法2執行後當我檢查(數據表)的ViewState( 「dtThis」)其具有的DataTable DT2即使我沒有指派DT2ViewState(「dtThis」)。(表示在ViewSate(「dtThis」)DataTable中刪除列 - 「FirstName」)。

任何想法爲什麼ViewState的這種類型的行爲?

如何保持原來的ViewState?

+1

使用DT的複製方法會幫助你創建數據表的副本。 – JSJ

回答

6

您正在將datatable的引用存儲到viewstate中。因此,在viewstate["dtThis"]上進行的任何更新都會直接影響method1()中分配的原始Datatable obj。

一來保留原始視圖狀態數據表的方法是使用DataTable.Copy()創建的原始副本,並在該副本操作

+0

那麼解決方案是什麼? 即使我試圖簡單的a = b; B = C; C = A;類型方法來維護原始值,但在任何情況下都會更新。 – nirav

+0

這是否適用於ViewState中的DataTables,或者如果我在ViewState中列出了一個List 並更新了List中的一個項目(例如,可能是一個壞例子) – lloydphillips

+0

考慮到人們如何使用ViewState,我無法相信這種行爲並沒有突出顯示ViewState的任何地方。我花了太長時間試圖弄清楚爲什麼我的viewstate [datatable]被破壞,直到我遇到這個問題。 – JoeManiaci

1

我不知道這是什麼緣故,但它也發生在我身上,但在那當時我有點急,所以我選擇了另一種方式。當我從ViewState獲得數據時,我創建了一個新表並循環遍歷原始表的記錄,並在新表中設置了值:)所以我的viewstate表保持不變。

+0

我也試過。像 - DataTable dt1 = ViewState(「dtThis」); DataTable dt_b = ViewState(「dtThis」); //從dt1中刪除列; ViewState(「dtThis」)= dt_b; 然後dt_b和ViewState(「dtThis」)我得到更新。 – nirav

+1

是這樣的: DataTable dt1 = ViewState(「dtThis」); DataTable dt_b = new DataTable(); 現在循環訪問dt1的列,並在dt_b中添加這些列,然後在dt1中移動行並在dt_b中添加這些行,這就是我如何使其工作。 –

0

這樣使用它解決問題的參考

DataTable dt2= ((DataTable)ViewState["dtThis"]).Copy(); 
+0

如果數據表實際上很大,它會不會是內存飢餓?因爲我們最終複製DataTable並創建一個新的。 – nirav