目前我的程序隐藏了空白或空数据网格视图单元格。我想找到一种完全删除这些单元格的方法。原因是,在隐藏了空白单元格后,它们会在经过我的其他验证之后重新出现。检查这些验证以查看单元格是否包含任何无效输入,例如负数,非数字输入和空白单元格。如果它们包含上述任何一个,它们将填充默认值,从而使我的隐藏单元格重新出现。希望如果有一种方法可以删除这些单元格,它们将无法更改填充默认数据。我在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
答案 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
以确保(您不会访问不存在的位置)。