Get DataGridViewComboboxColumn SelectedValue (VB.Net)

Peter  picture Peter · Jun 13, 2011 · Viewed 15k times · Source

I need to get the selected value of a ComboBox in a DataGridView. I have it partially working, but I get a Null Reference Exception if I change a another ComboBox in the grid. Here's my code:

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

This works fine the first time the ComboBox is changed, but generates a Null Reference Exception if another ComboBox is changed. Any ideas why this is happening? Note: I found most this code on MSDN's discussion forms.

Thanks!

Peter

Answer

Shawn Kovac picture Shawn Kovac · Oct 2, 2013

It's best to avoid global variables when they are unnecessary.

You just need to test for whether comboBox is nothing before trying to access a property of 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

It seems to me that when the comboBox is set from an old value to the new value, that this SelectedIndexChanged event gets called for both the old and new comboboxes. I suspect that when it gets called for the old comboBox, the sender is null/Nothing because its value is getting changed. Maybe. But no matter what it is happening, a null is a null. Just test that it's not null before you try to access any of its properties.