Получить DataGridViewComboboxColumn SelectedValue (VB.Net) - PullRequest
1 голос
/ 13 июня 2011

Мне нужно получить выбранное значение ComboBox в DataGridView. У меня это частично работает, но я получаю Null Reference Exception , если я изменю другой 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: " & comboBox.SelectedValue.ToString)
End Sub

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

Спасибо!

Peter

Ответы [ 3 ]

2 голосов
/ 03 октября 2013

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

Вам просто нужно проверить, является ли 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: " & comboBox.SelectedValue.ToString)
    End If
End Sub

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

1 голос
/ 13 июня 2011

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

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

0 голосов
/ 14 декабря 2011

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

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

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
...