#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