DataGridView DataError 未从第一行抛出

Posted

技术标签:

【中文标题】DataGridView DataError 未从第一行抛出【英文标题】:DataGridView DataError not thrown from first row 【发布时间】:2013-06-14 09:38:22 【问题描述】:

我有一个绑定到DataTableDataGridView,而DataTable 又是从数据库中填充的。在这个网格中,我有几个DataGridViewComboBoxColumns,数据绑定到ArrayLists,如下所示:

Dim ComboBoxData As ArrayList = New ArrayList(New String() "", 
                                                            "Default", 
                                                            "User-set")
Dim ComboBoxBS As BindingSource = New BindingSource
ComboBoxBS.DataSource = ComboBoxData
SomeDataGridViewComboBoxColumn.DataSource = ComboBoxBS

我想允许DataTable 中的字段可能具有与ComboBoxData 中定义的值不同的值。这是我通过处理DataError 事件并将缺失值添加到ComboBox 来完成的:

Private Sub grid_DataError(ByVal sender As System.Object, 
                           ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs
                           ) Handles grid.DataError
    If TypeOf grid.Columns(e.ColumnIndex) Is DataGridViewComboBoxColumn Then
        Dim value = grid.Rows(e.RowIndex).Cell(e.ColumnIndex).Value
        Dim cboCol As DataGridViewComboBoxColumn = CType(grdDataGrid2.Columns(e.ColumnIndex), DataGridViewComboBoxColumn)
        Dim bs As BindingSource = CType(cboCol.DataSource, BindingSource)
        If Not bs.Contains(value) Then
            bs.Add(value)
            bs.Position = bs.IndexOf(value)
        End If
        e.Cancel = False
        Return
    End If
End Sub

这适用于除第一行之外的所有行。通过调试,我确认DataError 事件确实不会在第一行触发。但是,行标题中有一个红色感叹号,声称“标准表达式中的数据类型不匹配”。

为什么第一行的行为与其他行不同?还请提出更好的方法来解决这个问题。

【问题讨论】:

我不确定,但任何表格的第一行大多是标题行。这不会造成什么吗? 我查过了。第一行(索引 0)是包含数据的第一行,而不是标题。 【参考方案1】:

尝试引用 DataGridViewComboBoxCell 而不是 DataGridViewComboBoxColumn。在我自己的情况下,将组合框列绑定到数据表,只有在引用单元格后,我才能让它将第一行更新为适当的新值。您可能只需要像我在下面最后一行代码中所做的那样重新分配值。

Dim comboCell As DataGridViewComboBoxCell = DirectCast(targetGrid.Rows(e.RowIndex).Cells(e.ColumnIndex), DataGridViewComboBoxCell)
Dim comboData As DataTable = DirectCast(comboCell.DataSource, DataTable)
Dim oRow As DataRowView = comboData.DefaultView.AddNew()
oRow(oComboCol.DataPropertyName) = targetValue
oRow.EndEdit()
comboData.AcceptChanges()
comboCell.Value = targetValue

【讨论】:

以上是关于DataGridView DataError 未从第一行抛出的主要内容,如果未能解决你的问题,请参考以下文章

DataGridViewComboBoxColumn值无效解决方法

DataGridView中的ComboboxCell报了System.ArgumentException:DagaGridViewComboBoxCell值无效错误

在C#的WinForm中,怎么在datagridview中插入复选框?

为啥这个 IndexedDB put 命令失败?错误:DataError:DOM IDBDatabase 异常 0

是否可以“如果出错则不提交更改”?

Unbound Datagridviewcomboboxcolumn值是否区分大小写?