Получить DataGridViewComboBoxColumn SelectedValue (VB.Net )

#vb.net #reference #null #selectedvalue #datagridviewcombobox

#vb.net #ссылка #null #выбранное значение #datagridviewcombobox

Вопрос:

Мне нужно получить выбранное значение ComboBox в DataGridView. У меня это частично работает, но я получаю исключение с нулевой ссылкой, если я изменяю другой ComboBox в сетке. Вот мой код:

 Private Sub dgvSampleList_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles dgvSampleList.EditingControlShowing
    Dim comboBox As ComboBox = CType(e.Control, ComboBox)

    If (comboBox IsNot Nothing) Then
        'Remove an existing event-handler
        RemoveHandler comboBox.SelectedIndexChanged, New EventHandler(AddressOf ComboBox_SelectedIndexChanged)

        'Add the event handler. 
        AddHandler comboBox.SelectedIndexChanged, New EventHandler(AddressOf ComboBox_SelectedIndexChanged)
    End If
End Sub

Private Sub ComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim comboBox As ComboBox = CType(sender, ComboBox)
    'Display selected value
    MsgBox("ProgramID: " amp; comboBox.SelectedValue.ToString)
End Sub
  

Это отлично работает при первом изменении выпадающего списка, но генерирует исключение с нулевой ссылкой при изменении другого выпадающего списка. Есть идеи, почему это происходит? Примечание: Большую часть этого кода я нашел в формах обсуждения MSDN.

Спасибо!

Питер

Ответ №1:

Лучше избегать глобальных переменных, когда они не нужны.

Вам просто нужно проверить, является ли ComboBox ничем, прежде чем пытаться получить доступ к свойству comboBox :

 Private Sub ComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim comboBox As ComboBox = CType(sender, ComboBox)
    'Display selected value
    If comboBox IsNot Nothing Then
        MsgBox("ProgramID: " amp; comboBox.SelectedValue.ToString)
    End If
End Sub
  

Мне кажется, что когда comboBox устанавливается из старого значения в новое значение, это событие SelectedIndexChanged вызывается как для старого, так и для нового выпадающих списков. Я подозреваю, что когда он вызывается для старого comboBox , отправитель равен null / ничего, потому что его значение меняется. Возможно. Но независимо от того, что это происходит, null есть null. Просто проверьте, что оно не равно null, прежде чем пытаться получить доступ к любому из его свойств.

Ответ №2:

Попробуйте проверить comboBox.SelectedItem.ToString вместо comboBox.SelectedValue.ToString

Надеюсь, это поможет.

Ответ №3:

У меня такая же проблема. Разобрался, внеся небольшие изменения в коды.

Объявить глобальную переменную

 Dim comboBoxCol As New DataGridViewComboBoxColumn
Dim gol As Integer = 0



 Dim comboBox As ComboBox
    Private Sub dgvSampleList_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DGVItems.EditingControlShowing
        comboBox = CType(e.Control, ComboBox)

        If (comboBox IsNot Nothing) Then

            'Add the event handler.  
            AddHandler comboBox.SelectedIndexChanged, New EventHandler(AddressOf ComboBox_SelectedIndexChanged)
            gol = 1
            'AddHandler comboBox.SelectionChangeCommitted, New EventHandler(AddressOf ComboBox_SelectedIndexChanged)
        End If
    End Sub

    Private Sub ComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
        comboBox = CType(sender, ComboBox)
        If gol = 1 Then
            Dim item As String = comboBox.Text
            MsgBox(item)
            gol = 0
        End If
  End Sub