У меня есть таблица данных, отображающая информацию о пользователе. Источником данных является таблица набора данных, и я хочу, чтобы значения этого набора данных динамически изменялись, когда пользователь изменяет значения в представлении данных. Чтобы сделать это, я использовал событие cellvaluechanged datagridview.
Для некоторых полей требуется комбинированный список с выпадающим списком или допустимыми полями. Поэтому в этих случаях я создаю комбинированную ячейку.
Все это прекрасно работает. ОДНАКО в некоторых случаях мне нужен раскрывающийся список, и мне нужно разрешить ручной ввод ячейки.
Я нашел решение прямо здесь по переполнению стека, которое МОЖНО работает:
как разрешить ввод вручную в комбинированном списке datagridview в c #
...., обработав событие 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. Но я не знаю, как это проверить и, что более важно, как это решить.
Подводя итог, мне нужно, чтобы пользователи могли нажимать «ввод» в блоке данных datagridview, с этим взрывом.
Будем благодарны за любые предложения.
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