在 C# 中更改 DataTable 中的行顺序

nem*_*_87 6 c# sorting datatable

是否可以更改 DataTable 中的行顺序,例如当前索引为 5 的行移动到索引为 3 的位置,等等?

我有这个遗留的、混乱的代码,其中下拉菜单从 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"]);
    } 
Run Code Online (Sandbox Code Playgroud)

例如,我想将行 2011 - 先前发放的信用推到数据表的顶部。

在此输入图像描述

解决方案:

对于那些可能在 DataTable 中对行进行排序以及使用不支持 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);
Run Code Online (Sandbox Code Playgroud)

您必须克隆行,删除它并使用新索引再次插入它。此代码将索引为 6 的行移动到 DataTable 中的第一位。

lys*_*ysp 1

您可以使用 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"]);
} 
Run Code Online (Sandbox Code Playgroud)

按多列排序:

result.Rows.OrderBy(x => x.ColumnName).ThenBy(x => x.OtherColumnName).ThenBy(x.YetAnotherOne)
Run Code Online (Sandbox Code Playgroud)

按特定值排序:

result.Rows.OrderBy(x => (x.ColumnName == 2001 or x.ColumnName == 2002) ? 0 : 1).ThenBy(x => x.ColumName)
Run Code Online (Sandbox Code Playgroud)

您可以使用上面的代码将某些行“固定”到顶部,如果您想要更细粒度,您可以使用开关例如将特定值排序为 1、2、3、4 的排序值并使用更大的数字对于其余的。