从数据表+ AcceptChanges中删除行

时间:2009-10-14 14:06:02

标签: asp.net datatable

我的ASP.NET应用程序中有2个数据表。我循环遍历它们,如果我找到匹配项,我会从外部数据表中删除该特定行,如下所示:

For i As Integer = 0 To dtFixedActs.Count - 1
        For j As Integer = 0 To dtTotals.Count - 1                
            If dtFixedActs.Rows(i).Item("Activity") = dtTotals.Rows(j).Item("Activity") Then
                dtFixedActs.Rows(i).Delete()
                i += 1
                j += 1
            End If
        Next            
        dtFixedActs.AcceptChanges()
    Next

这种方法很好,除非dtFixedActs只包含1行并且在另一个数据表中找到匹配项。我得到“位置1没有行”错误。这是有道理的,因为i + = 1我想到下一行,这在这种情况下是不可能的。

我试图在第一个循环中移入dtFixedActs.AcceptChanges命令,但无济于事。我还注释掉了i + = 1行,但后来我得到了“删除的行信息无法通过该行访问”。错误。

我不知道如何解决这个问题。当dtFixedActs包含多于1行时,不会发生此问题。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

最奇怪的是,我似乎已经解决了这个问题。我添加了一个try catch异常代码块,如下所示:

For i As Integer = 0 To dtFixedActs.Count - 1
        For j As Integer = 0 To dtTotals.Count - 1                
            Try
                If dtFixedActs.Rows(i).Item("Activity") = dtTotals.Rows(j).Item("Activity") Then
                    dtFixedActs.Rows(i).Delete()
                    i += 1
                    j += 1
                End If
            Catch ex As Exception

            End Try

        Next
        dtFixedActs.AcceptChanges()
    Next

现在一切似乎都很好。 有没有人对此有解释,因为我怀疑这是一个有效的解决方案?

答案 1 :(得分:0)

如果找到匹配项dfFixedActs(dtFixedActs.Count - 1),则会出现问题,因为我增加到了边界外。 只是添加了一个条件来防止i或j移出边界,例如i< = dtFixedActs.Count - 1和j< = dtTotals.Count - 1.

答案 2 :(得分:0)

在应用程序中寻找缓慢的性能我发现try / catch是您可以执行的最昂贵的操作之一。在我的测试中,不久前,它需要250毫秒。从那以后,我从不使用try catch,除非作为我从未想过的最终保护措施。即使这样,我也会安排记录错误,以便能够直接识别和处理特定错误。