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

时间:2016-04-07 07:26:35

标签: c# sorting datatable

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

我有这个遗留的,凌乱的代码,其中下拉菜单从DataTable获取它的值,从数据库中获取它的值。在数据库中进行更改是不可能的,因为它有太多的列和条目。我原来的是在db中添加新列并按其值排序,但这很难。

因此,这只是向用户呈现的问题,我想只是在该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

解决方案:

对于那些在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);

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

4 个答案:

答案 0 :(得分: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"]);
} 

按多列排序:

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

按特定值排序:

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

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

答案 1 :(得分:1)

如果您真的想要随机性,可以在LINQ Guid.NewGuid中使用OrderBy

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);

答案 2 :(得分:0)

您不能更改顺序或删除foreach循环中的行,您应该创建一个新数据表并随机将行添加到新数据表中,您还应该跟踪插入的行不要重复

答案 3 :(得分:0)

使用DataView

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)