【问题标题】:Method to remove empty rows from DataTable?从 DataTable 中删除空行的方法?
【发布时间】:2012-12-20 18:46:35
【问题描述】:

我解析了一个 Excel 电子表格并将整个结果作为数据表返回。但是,这个 Excel 电子表格有几个空行,我想从生成的 DataTable 中删除它们。特别是,每个空行都以一个空单元格开始。所以,我知道如果第一个索引处的单元格的值为空,则整行都是空的。请注意,我不能简单地修改 Excel 电子表格,因为我必须准确地处理客户发送给我的内容。根据这些信息,我假设我可以执行以下函数来删除空行:

' DataTable dt has already been populated with the data

For Each row As DataRow In dt.Rows
    If dt.Rows.Item(0).ToString = "" Then
        dt.Rows.Remove(row)
    ElseIf dt.Rows.Item(0) Is Nothing Then
        dt.Rows.Remove(row)
    End If
Next

但是,在制定此解决方案后,我收到以下错误:

Collection was modified; enumeration operation might not execute.

我现在意识到我无法在访问集合时更改它。我怎样才能解决这个问题?我想知道是否应该使用非空行创建一个新的 DataTable。这是最好的方法还是有更好的选择?

编辑:我也尝试过向后迭代行:

For i = dt.Rows.Count() - 1 To 0
    If dt.Rows.Item(i).Item(0).ToString = "" Then
        dt.Rows.RemoveAt(i)
    End If
Next

【问题讨论】:

  • 您的For 循环缺少Step -1 以向后迭代。

标签: asp.net vb.net datatable


【解决方案1】:

在使用For Each 枚举集合时,您无法修改集合,但一个简单的For 循环将起作用。您需要向后循环以避免在删除的行之后跳过该行。

你的测试也弄错了;如果Item(0) 返回Nothing,那么Item(0).ToString 将抛出NullReferenceException

我假设dt.Rows.Item(0) 是一个错字,应该改为row.Item(0)

For i As Integer = dt.Rows.Count - 1 To 0 Step -1
    Dim row As DataRow = dt.Rows(i)
    If row.Item(0) Is Nothing Then
       dt.Rows.Remove(row)
    ElseIf row.Item(0).ToString = "" Then
       dt.Rows.Remove(row)
    End If
Next

【讨论】:

  • 谢谢!这正是我想要的。
【解决方案2】:

使用 linq 的 Vb.Net

 Dtset.Tables(0).AsEnumerable().Where(Function(row) row.ItemArray.All(Function(field) field Is Nothing Or field Is DBNull.Value Or field.Equals(""))).ToList().ForEach(Sub(row) row.Delete())
        Dtset.Tables(0).AcceptChanges()

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多