2011-06-13 69 views
1

我需要在DataGridView中获取ComboBox的选定值。我有它的部分工作,但我得到一个空引用异常如果我更改网格中的另一个组合框。这里是我的代码:Get DataGridViewComboboxColumn SelectedValue(VB.Net)

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 

也能正常工作的第一次组合框改变,但是如果另一组合框改变产生一个空引用异常。任何想法为什么发生这种情况?注意:我在MSDN的讨论表单中发现了大部分代码。

谢谢!

彼得

回答

1

尝试检查comboBox.SelectedItem.ToString代替comboBox.SelectedValue.ToString

希望有所帮助的。

0

我有同样的问题。通过对代码进行细微更改而排序。

声明一个全局变量

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 
2

这是最好的避免全局变量时,他们是不必要的。

你只需要测试组合框是否试图访问的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,因为它的值正在改变。也许。但不管发生了什么,null都是null。在尝试访问它的任何属性之前,只需测试它是否为空。