1、DataGridView属性: AllowUserAddToRow=True、EditMode=EditOnEnter;DataGridView邦定到数据源。并在CellEndEdit事件中加入以下代码:
If e.RowIndex = Me.DataGridView1.Rows.Count - 1 Then Exit Sub'跳过最后一行(即空白行)。
Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString.Trim'截掉单元格内容左右空白字符。
程序运行时发现问题:当将光标移入DataGridView表格最后一行(即空白行)然后不输入内容就移开,此时DataGridView并不会自动添加一新行,但是数据源中却自动新添加了一行,而且每重复一次这样的操作就自动新添加了一行。
后发现是由Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value.ToString.Trim引起的,但If e.RowIndex = Me.DataGridView1.Rows.Count - 1 Then Exit Sub已经作了限制,事实上在最后一行时的确没有运行那条语句,因此这可能是Bug!
2、关于DataGridView行验证的"虫"(问题最为严重,也最复杂),看以下代码:
'验证一行的“银行编号”是否为空
Private Sub DataGridView1_RowValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.RowValidating
If blnLoadForm Then Exit Sub '加载窗体中跳过行验证
If e.RowIndex = Me.DataGridView1.Rows.Count - 1 Then Exit Sub
If String.IsNullOrEmpty(Me.DataGridView1.Rows(e.RowIndex).Cells("银行编号").Value.ToString.Trim) Then
Me.DataGridView1.Rows(e.RowIndex).Cells("银行编号").Selected = True
Me.DataGridView1.BeginEdit(True)
Me.DataGridView1.Rows(e.RowIndex).ErrorText = "银行编号不能为空"
blnRowValidated = False
e.Cancel = True
Exit Sub
End If
blnRowValidated = True
Me.DataGridView1.Rows(e.RowIndex).ErrorText = Nothing
End Sub
问题描述如下:这段程序所在的窗体如果是以单独窗体运行的话是没有问题的,但如果是以MDI的子窗体运行的话,如果DataGridView行验证信息不能满足时单击其它控件(如Button控件)整个程序将没有响应而且CPU占用率达到90%以上,但如果单击其它单元格则没有问题。经发现如果去除e.Cancel=True语句则没有问题,但是这样的话如果单击其它单元格时行验证不能满足时又无法中止后续操作。
另外一个大问题就是在编辑一行时,如果行验证信息不能满足时就去点击列标题进行排序时,行验证时将出错。(操作无效,原因是它导致对SetCurrentCellAddressCore函数的可重入调用。)
以上两点是我在用DataGridView控件时发现的问题,个人觉得应该算是Bug,特别是第2点,到现在我都还不知道如何解决,如有哪位朋友有遇到这样的问题并解决的,烦请共享给我,谢谢!