2016-04-07 21 views
1

是否可以更改DataTable中的行的順序,例如當前索引爲5的索引移動到索引爲3等位置?在C#中的DataTable中更改行的順序

我有這個傳統,凌亂的代碼,其中下拉菜單從DataTable中獲取它的值,它從數據庫中獲取它的值。因爲它有太多的列和條目,所以不可能對數據庫進行更改。我的原始雖然是在數據庫中添加新的列和它的值,但這將是艱難的。

所以,因爲這只是呈現給用戶的問題,我只是想在該DataTable中切換行的順序。有人知道在C#中執行此操作的最佳方法嗎?

這是我當前的代碼:

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 

    foreach (DataRow row in result.Rows) 
    { 
     m_cboReasonCode.Properties.Items.Add(row["FLOKKUR"].ToString().Trim() + " - " + row["SKYRING"]); 
    } 

例如,我要推行2011 - 先前發出的DataTable的最高信用。

enter image description here

SOLUTION:

對於那些誰可能與數據表中的行排序,並與過時的技術,不工作的問題,支持LINQ的這可能幫助:

DataRow firstSelectedRow = result.Rows[6]; 
DataRow firstNewRow = result.NewRow(); 
firstNewRow.ItemArray = firstSelectedRow.ItemArray; // copy data 
result.Rows.Remove(firstSelectedRow); 
result.Rows.InsertAt(firstNewRow, 0); 

你有克隆行,刪除它並再次插入一個新的索引。此代碼將索引6的行移至DataTable中的第一位。

+0

你真的想隨機訂購嗎?如果是這樣,隨機只有一次或總是不同?既然你想添加一個專欄,你是否有一個商業邏輯要用於你的訂購? –

+0

@TimSchmelter喜Tim,隨機只有一次。我一直想成爲這樣的人。用戶只需要在該下拉菜單的頂部添加一些條目。 (用戶將成爲用戶)我已經附加了更多關於我想要完成的解釋的圖片。 –

+0

這可能會幫助你http://stackoverflow.com/questions/7801714/how-to-extract-10-random-rows-from-datatable –

回答

0

您可以使用LINQ命令行:

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 

foreach (DataRow row in result.Rows.OrderBy(x => x.ColumnName)) 
{ 
    m_cboReasonCode.Properties.Items.Add(row["FLOKKUR"].ToString().Trim() + " - " + row["SKYRING"]); 
} 

要通過多列排序:

result.Rows.OrderBy(x => (x.ColumnName == 2001 or x.ColumnName == 2002) ? 0 : 1).ThenBy(x => x.ColumName) 

您可以使用:

result.Rows.OrderBy(x => x.ColumnName).ThenBy(x => x.OtherColumnName).ThenBy(x.YetAnotherOne) 

要通過特定的價值秩序上面的代碼將某些行「釘扎」到頂端,如果您希望獲得更精細的結果,則可以使用開關進行特定排序值分類爲1,2,3,4的排序值,其餘的使用更高的數值。

+1

不在乎問題的「隨機」部分 –

+0

@lysp按列名排序並不是問題......但事情是我需要按行排列:( –

+0

「隨機」是由(第3代碼塊) – lysp

0

您不能更改順序或在foreach循環中刪除行,你應該創建一個新的DataTable和隨機行添加到新的數據表,你也應該跟蹤插入的行不復制

0

使用數據視圖

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 
DateView view = new DateView(result); 
view.Sort = "FLOKKUR"; 
view.Filter = "... you can even apply an in memory filter here ..." 

foreach (DataRowView row in view.Rows) 
{ 
    .... 

每個數據錶帶有一個視圖DefaultView,您可以使用,這樣你可以將默認的排序在數據層/過濾。

public DataTable GetMCCHABAKflokka(string tableName, string sort, string filter) 
{ 
    var result = GetMCCHABAKflokka(tableName); 
    result.DefaultView.Sort = sort; 
    result.DefaultView.Filter = filter; 
    return result; 
}  

// use like this 
foreach (DataRowView row in result.DefaultView) 
+0

不要忘記DataTable保持不變只有你的視圖是排序的你可以用view將視圖轉換回DataTable.DefaultView.ToTable() – CathalMF

0

如果你真的想要的隨機性,你可以在LINQ的OrderBy使用Guid.NewGuid

DataTable result = flokkurDao.GetMCCHABAKflokka("MSCODE"); 
var randomOrder = result.AsEnumerable().OrderBy(r => Guid.NewGuid()); 
foreach (DataRow row in randomOrder) 
{ 
    // ... 
} 

如果你真的不想要的隨機性,但你想在頂部的特定值,你可以使用:

var orderFlokkur2011 = result.AsEnumerable() 
    .OrderBy(r => r.Field<int>("FLOKKUR") == 2011 ? 0 : 1); 
+0

我可能沒有這樣做,我不需要完全的隨機性,我需要以一種非常規的方式對它們進行排序,例如:索引爲5的行始終位於DataTable的頂部,而行的索引爲2切換到索引3,等我需要這個訂單隻有一次,這就是它應該留下.... @TimSchmelter –

+0

你見過我的第二種方法嗎? –

+0

我剛剛做過,當我添加它時它缺少DataTable的AsEnumerable和OrderBy,你可能知道我必須包含哪些名稱空間來獲取它們嗎?我甚至有可能做不到這一點,因爲這是使用WinForms的超級舊軟件... @TimSchmelter –