2012-09-18 108 views
13

我試着用以下兩種方式排序數據表

table.DefaultView.Sort = "Town ASC, Cutomer ASC" 

table.Select("", "Town ASC, Cutomer ASC") 

但他們都不是沒有工作排序的數據表。它始終以原始順序顯示數據。你有什麼想法來解決這個問題。

回答

20

設置在默認視圖排序表達式(table.DefaultView.Sort = "Town ASC, Cutomer ASC"),你應該循環比使用默認視圖不是DataTable實例本身

foreach(DataRowView r in table.DefaultView) 
{ 
    //... here you get the rows in sorted order 
    Console.WriteLine(r["Town"].ToString()); 
} 

使用DataTable代替選擇方法的表,產生的DataRow的陣列後。這個數組排序從您的要求,而不是數據表

DataRow[] rowList = table.Select("", "Town ASC, Cutomer ASC"); 
foreach(DataRow r in rowList) 
{ 
    Console.WriteLine(r["Town"].ToString()); 
} 
+0

它工作。感謝您的幫助 – pasanmaduranga

0
private void SortDataTable(DataTable dt, string sort) 
{ 
DataTable newDT = dt.Clone(); 
int rowCount = dt.Rows.Count; 

DataRow[] foundRows = dt.Select(null, sort); 
// Sort with Column name 
for (int i = 0; i < rowCount; i++) 
{ 
object[] arr = new object[dt.Columns.Count]; 
for (int j = 0; j < dt.Columns.Count; j++) 
{ 
arr[j] = foundRows[i][j]; 
} 
DataRow data_row = newDT.NewRow(); 
data_row.ItemArray = arr; 
newDT.Rows.Add(data_row); 
} 

//clear the incoming dt 
dt.Rows.Clear(); 

for (int i = 0; i < newDT.Rows.Count; i++) 
{ 
object[] arr = new object[dt.Columns.Count]; 
for (int j = 0; j < dt.Columns.Count; j++) 
{ 
arr[j] = newDT.Rows[i][j]; 
} 

DataRow data_row = dt.NewRow(); 
data_row.ItemArray = arr; 
dt.Rows.Add(data_row); 
} 
} 
23

試試這個:

Dim dataView As New DataView(table) 
dataView.Sort = " AutoID DESC, Name DESC" 
Dim dataTable AS DataTable = dataView.ToTable() 
+7

好,但是您應該建議這種方法創建一個重複的數據表,如果原始數據表很大,這不是非常有效 – Steve

13

這是我能找到,而無需創建任何新的排序數據表中的最短路徑變量。

DataTable.DefaultView.Sort = "ColumnName ASC" 
DataTable = DataTable.DefaultView.ToTable 

其中:

ASC - 升序

DESC - 降序

的ColumnName - 要通過

的DataTable排序的列 - 要排序

+0

最適合我的解決方案就在這裏。工作很快,我實際上已經將其納入,以減輕數據庫查詢和執行排序客戶端。要添加,請按逗號分隔多列,即:「Col1 ASC,Col2 DESC,Col3 ASC」 – dya