如何在导入时删除空的datagridview单元格

时间:2013-08-14 14:31:23

标签: vb.net datagridview

目前我的程序隐藏了空白或空数据网格视图单元格。我想找到一种完全删除这些单元格的方法。原因是,在隐藏了空白单元格后,它们会在经过我的其他验证之后重新出现。检查这些验证以查看单元格是否包含任何无效输入,例如负数,非数字输入和空白单元格。如果它们包含上述任何一个,它们将填充默认值,从而使我的隐藏单元格重新出现。希望如果有一种方法可以删除这些单元格,它们将无法更改填充默认数据。我在MSDN上找到了以下代码,但它似乎无论出于何种原因都无法正常工作。我也在使用DATABINDINGCOMPLETE事件。我不确定是否还有其他事件可以更好地适应这种情况。非常感谢您给予的任何帮助!

   Private Sub DataGridView1_DataBindingComplete(sender As Object, e As DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete


    Dim i As Integer = 0
    Dim mtCell As Integer = 0
    For Each row As DataGridViewRow In DataGridView1.Rows
        For j = 1 To row.Cells.Count -2
            If row.Cells(j).Value Is DBNull.Value Then
                mtCell += 1
            End If
        Next
        If mtCell = row.Cells.Count Then
            DataGridView1.Rows.RemoveAt(i)
        End If
        i += 1
        mtCell = 0
    Next

end sub

1 个答案:

答案 0 :(得分:1)

您的代码存在各种问题。在这里你有一个改进版本应该没有任何问题:

Dim mtCell As Integer = 0
Dim row As DataGridViewRow = New DataGridViewRow()
For rowNo As Integer = DataGridView1.Rows.Count - 2 To 0 Step -1
    row = DataGridView1.Rows(rowNo)
    Try
        For j = 0 To row.Cells.Count - 2 
            If row.Cells(j).Value Is Nothing OrElse row.Cells(j).Value Is DBNull.Value Then
                mtCell += 1
            End If
        Next
        If mtCell = row.Cells.Count - 1 Then 'I understand that you want to delete the row ONLY if all its cells are null 
            DataGridView1.Rows.RemoveAt(rowNo)
        End If
        mtCell = 0
    Catch ex As Exception
        Exit For
    End Try
Next rowNo

首先,最好在删除时向后“迭代”迭代,以避免出现问题(例如:3行;删除第一个位置,循环转到第二个;但删除后所有行“向上移动”,因此第二个位置现在被第三行占据 - >您将跳过第二行,并最终迭代超出集合的限制)。 DBNull.Value非常严格;不确定它是否在您的特定条件下正常工作,但更好地用Nothing补充它。您不能影响在For Each循环中迭代的项目(在普通For循环中不太可能);在这种情况下,你间接地影响它,但只是为了确保,更好地依赖于正常的For循环。您正在遍历行但是您没有删除这些行,而是由计数器(i)定义的那些行,这些行不一定与当前行号相关,更好地去掉它。最后,我添加了try...catch以确保(您不会访问不存在的位置)。