2012-06-28 17 views
1

我有點類似於一個書面波紋管(這只是一個僞代碼,我工作在C#)的方法:排序的DataTable影響引用的數據表

function GenerateChart(DataTable dt) 
{ 
    DataTable dtChartTable = dt; 
    dtChartTable.DefaultView.Sort = "SomeColumnName"; 
    //remaining functionality 
} 

這是什麼上面的代碼所做的是它也對dt中的記錄進行排序。我不明白爲什麼它這樣做。就像一個註釋:這個函數是從兩個不同的地方調用的。在一個地方我發送一個Datatable對象,而另一個Datatable直接從存儲在會話中的數據表中引用。

回答

1

沒錯。 您正在將dtChartTable變量設置爲由dt變量表示的相同內存。 因此,排序dtChartTable會影響第二個使用的DefaultView屬性。

如果不希望這種行爲,你可以使用

DataTable dtChartTable = dt.Copy(); 

創建DT的副本,但這是昂貴的,因爲這樣每一個數據行被複制。
另一種可能性是創建一個新的數據視圖

DataView view = new DataView(dt); 
view.Sort = "SomeColumnName"; 
...... 

這並不影響原有dt.DefaultView,你可以從這個新的數據視圖

+0

是因爲Datatable是引用類型,所以它是這樣做的。我可以做dt.Clone(),然後將行導入到dtChartTable中,就像dt.Copy() – user1151698

+0

一樣昂貴。DataView是IMO的最佳選擇。 –

+0

如果您只對排序感興趣,那麼就沒有理由這麼做。只需創建一個不同的DataView。 – Steve

1

當你處理你的DataRowView的

DataTable dtChartTable = dt; 

它創建一個新副本,但都指向內存中的相同位置,因爲Datatable是引用類型,因此您的更改反映在其他位置。

而是做

DataTable dtChartTable = dt.Copy(); 

這使得複製和引用不同的內存位置。其中一個變化不反映在其他。