Добавление значений в datagridcomboboxcell во время проверки + нажатие Enter = Null Reference - PullRequest
0 голосов
/ 08 октября 2019

У меня есть таблица данных, отображающая информацию о пользователе. Источником данных является таблица набора данных, и я хочу, чтобы значения этого набора данных динамически изменялись, когда пользователь изменяет значения в представлении данных. Чтобы сделать это, я использовал событие 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
...