0

我有一个DataGridView绑定到的一个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事件确实不会在第一行触发。但是,行标题中有一个红色感叹号,声称“标准表达式中的数据类型不匹配”。

为什么第一行不像其他行那样表现?还请提出更好的方法来解决这个问题。

4

1 回答 1

0

尝试引用 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
于 2014-06-04T15:18:34.137 回答