C# DataTable 删除行

5

我有一个 DataTable,其中的 participantAccounts 并未连接到任何数据库或其他东西。

我该如何从中删除一行?

这种方式不起作用:

for (int i = participantAccounts.Rows.Count - 1; i >= 0; i--) {
          DataRow dr= participantAccounts.Rows[i];
          if (Equals(dr["sellrMembId"].ToString(), itemId))
            participantAccounts.Rows.RemoveAt(i);
        }

        participantAccounts.AcceptChanges();

看起来好像一切都正常,但行仍然留在数据表中。 我也尝试了 dr.Delete(),但它也不起作用。 当我尝试 participantAccounts.Rows.Remove(dr) 时,我会得到一个异常 The given DataRow is not in the current DataRowCollection.

我做错了什么?


尝试使用以下代码:DataRow dr = participantAccounts.Rows[i]; if (Equals(dr["sellrMembId"].ToString(), itemId)) { dr.Delete(); } - Michael
问题在于你在循环表格时删除了行。你应该使用for each并使用.Remove([Datarow])来删除行。 - Franck
迈克尔 - 我尝试了,但没有效果。 - Maarty
Franck - 当我使用 Remove 时,我得到了一个异常 The given DataRow is not in the current DataRowCollection. (I used it outside of cycle) - Maarty
@Maarty,在 foreach 循环后,你是否仍然调用 participantAccounts.AcceptChanges(); - Michael
我不再删除行,或很少这样做,通常我使用对象。但是当我需要删除时,我会执行一个反向选择,例如如果我想要删除所有价格大于100的记录,则会执行以下操作(伪代码):myDatatable = myDatatable.Select("Price < 100"); - Franck
7个回答

4
if (participantAccounts.Rows.Contains(itemId))
            {
                DataRow foundRow = participantAccounts.Rows.Find(itemId);
                participantAccounts.Rows.Remove(foundRow);

           }

当我使用这种方法时,我会得到一个异常:“给定的 DataRow 不在当前 DataRowCollection 中。” - Maarty
参与者账户的值 participantAccounts.Rows.Contains(itemId) 是多少? - Deepak Mishra
找到行后,foundRow 被加载了,但在 Remove(foundRow) 时出现了异常。 - Maarty
你能告诉我在 remove 语句之前 foundRow.RowState 的值吗? - Deepak Mishra

3
for (int i = participantAccounts.Rows.Count - 1; i >= 0; i--)
{
    DataRow dr= participantAccounts.Rows[i];
    if (Equals(dr["sellrMembId"].ToString(), itemId))
    {
        participantAccounts.Rows.Delete();
        participantAccounts.AcceptChanges();
    }
}

你能解释一下这段代码是做什么的,以及它如何解决问题吗? - ChrisF
在循环中绝对不需要调用 AcceptChanges - Andrey Korneyev
如果我们调用AcceptChanges()函数,那么表就会减少行数,以便在最后的循环计数中不会出现异常。 - Vimal Vataliya

3

最终我找到了解决方法。 这与删除行的方式无关。

DataTable dt = participantAccounts;
        dt.Rows.Remove(dt.Rows.Find(itemId));
        participantAccounts = dt;

问题是,我认为participantAccounts是一个视图状态(.ASP),因此它不会通过直接方法进行更新。
感谢所有人的帮助。

2

您应该使用Delete而不是RemoveAt

因此,您的代码可能如下所示:

for (int i = participantAccounts.Rows.Count - 1; i >= 0; i--) 
{
      var dr= participantAccounts.Rows[i];
      if (object.Equals(dr["sellrMembId"], itemId))
         dr.Delete();
}

participantAccounts.AcceptChanges();
注意: 你删除的数据行会在 DataTable 中呈现,并且具有 RowStatus = Deleted,直到你在 DataTable 上调用 AcceptChanges 方法。在调用 AcceptChanges 后,已删除的数据行将从表中移除。

请参考 MSDN 关于 DataRow.Delete 方法的说明。


2
int index = -1;

for (int i = participantAccounts.Rows.Count - 1; i >= 0; i--)
{
    DataRow dr= participantAccounts.Rows[i];
    if (Equals(dr["sellrMembId"].ToString(), itemId))
    {
        index = i;
        break;
    }
}

participantAccounts.Rows.RemoveAt(index);
participantAccounts.AcceptChanges();

2

2

您应该使用foreach循环来获取每一行,并找到要删除的特定行。以下是代码片段。

foreach (DataRow row in participantAccounts.Rows)
{
   if (row["sellrMembId"].ToString() == itemId)
   {
      participantAccounts.Rows.Remove(row);
      participantAccounts.AcceptChanges();
      break;
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接