0

我有一个显示用户信息的数据网格视图。数据源是一个数据集表,我希望这个数据集的值在用户编辑 datagridview 中的值时动态变化。为此,我利用了 datagridview 的 cellvaluechanged 事件。

某些字段需要带有下拉列表或允许字段的组合框。所以在这些情况下,我创建了一个组合框单元。

所有这一切都很好。但是在某些情况下,我需要一个下拉菜单,并且我需要允许手动输入单元格。

我在这里找到了一个最有效的堆栈溢出解决方案:

如何允许用户在 c# 中的 datagridview 组合框中手动输入

....通过处理 datagridview.editingcontrolshowing 事件并允许它调用 datagridcell.validating 事件,我可以将自由格式文本添加到 comboboxcell 下拉列表并选择它。我的更新代码如下。

以上所有方法都很好,如果在输入自由格式输入后,用户只需单击另一个单元格。但是,如果用户点击 ENTER(就像用户可能会做的那样),则会触发另一个cellvaluechanged事件。逐行运行我的代码,这似乎仍然有效,直到验证事件结束时我立即得到以下信息:

System.NullReferenceException: Object Reference not set to an instance of an object at System.Windows.Forms.DatagridView.EndEdit.....

这是一个未处理的异常,不会中断我的任何代码,因此我无法确切看到它发生的位置。我假设当 cellvaluechanged 事件更新数据源时组合框正在处理。但我不知道如何验证,更重要的是如何解决它。

底线,我需要用户能够在 datagridviewcombobox 中点击“输入”,然后爆炸。

任何建议,将不胜感激。

    Private Sub propertiesGrid_CellValueChanged(sender As Object, e As System.EventArgs) Handles propertiesGrid.CellValueChanged

       CFS_DatasetMain.CFSPROPERTIES.AcceptChanges()
    End Sub

 Public Sub propertiesGrid_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles propertiesGrid.EditingControlShowing
        Dim cbo As DataGridViewComboBoxEditingControl

                If TypeOf (e.Control) Is DataGridViewComboBoxEditingControl Then
                    cbo = e.Control
                    cbo.DropDownStyle = ComboBoxStyle.DropDown
                    AddHandler cbo.Validating, AddressOf cbo_Validating
                End If
    End Sub


  Public Sub cbo_Validating(sender As Object, e As EventArgs)
        Dim cbo As DataGridViewComboBoxEditingControl
            cbo = CType(sender, DataGridViewComboBoxEditingControl)

            If (cbo.Items.IndexOf(cbo.Text) = -1) Then
                 cbo.Items.Add(cbo.Text)
                   propertiesGrid.CurrentCell.Value = cbo.Text
            End If
 End Sub
4

0 回答 0