我有一个显示用户信息的数据网格视图。数据源是一个数据集表,我希望这个数据集的值在用户编辑 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