Search code examples
vb.netdatagridviewdatagridviewcombobox

DataGridViewComboBox error vb.net


I'm quite lost in this error I'm getting. I have a Combobox that I added to my dgv, I am able to fill my combo-box with the values I want yet I keep getting an exception when I make a selection change on the dgv itself. Every time I choose a value from the combo box and then perform a selection change on the dgv the error that is thrown is : DataGridViewComboBoxCell is not valid . After this error is thrown, the value in the combo box is set to nothing.

This is my first time posting and I've done alot of research for the past two days and I can't seem to get anywhere. If you guys would like me to post my code I will do so. Thanks.

Edit: added my code:

cmbItem = New cboItem(dr.Item("strFolderName"), dr.Item("strFolderPath"), dr.Item("strEntryID"))

Dim dtmTmp As Date = oItem.ReceivedTime
dgvEmails.Rows.Insert(intEmailPosition, {False, dtmTmp.ToString("dd-MMM-yyyy hh:mm tt"), GetRecipientEmail(oItem), oItem.subject.ToString, cmbItem, oItem.conversationid.ToString, oItem.entryid.ToString, strFoundBy, oItem.body})

DirectCast(dgvEmails.Rows(intEmailPosition).Cells("cboFileTo"), DataGridViewComboBoxCell).Items.Add(cmbItem)
DirectCast(dgvEmails.Rows(intEmailPosition).Cells("cboFileTo"), DataGridViewComboBoxCell).DisplayMember = "DisplayText"

This is how I am adding the items into the combobox. Am I doing something wrong?

Edit: Added extra code

Dim cellComboBox As ComboBox = TryCast(e.Control, ComboBox)
        RemoveHandler cellComboBox.SelectedIndexChanged, AddressOf Me.cellComboBox_SelectedIndexChanged
        AddHandler cellComboBox.SelectedIndexChanged, AddressOf Me.cellComboBox_SelectedIndexChanged 'trapping the event handler


        If cellComboBox IsNot Nothing Then
            'load all values into the combox box 
            cellComboBox.MaxDropDownItems = 6 'drop down list can only have 5 items in there

            Try
                strEmail = dgvEmails.SelectedRows(0).Cells(2).Value.ToString 'cells(2) holds the email address
                strConvoID = dgvEmails.SelectedRows(0).Cells(5).Value.ToString 'cells(5) holds the conversation id of the email
            Catch ex As Exception
            End Try
            'call GetSuggestion function here
            objclsSuggesstion.GetSuggestion(strConvoID, strEmail, NUMBER_SUGGESTIONS)

            For intI = 0 To NUMBER_SUGGESTIONS - 1
                dr = objclsSuggesstion.GetItem(intI)
                If dr IsNot Nothing Then
                    'add dr to the combo box
                    cboItem = New cboItem(dr.Item("strFolderName"), dr.Item("strFolderPath"), dr.Item("strEntryID"))


                    'If Not cellComboBox.SelectedItem.FolderEntryID = cboItem.FolderEntryID Then 'if does not exist then add
                    cellComboBox.Items.Add(cboItem)
                    'End If

                Else
                    Exit For
                End If
            Next

            'cellComboBox.Items.Add(cboItem)
            cboItem = Nothing 'make object nothing here
            cboItem = New cboItem("", "", "", "<choose folder>...") 'create new object & add

            'if <choose folder>... doesn't exist, then you add it. 
            Try
                If Not cellComboBox.SelectedItem.DisplayText = cboItem.DisplayText Then
                    'cellComboBox.Items.Add(cboItem)
                    'DirectCast(dgvEmails.SelectedRows(0).Cells("cboFileTo"), DataGridViewComboBoxCell).Items.Add(cboItem)
                    'DirectCast(dgvEmails.SelectedRows(0).Cells("cboFileTo"), DataGridViewComboBoxCell).DisplayMember = "DisplayText"
                    cellComboBox.Items.Add(cboItem)
                End If
            Catch ex As Exception
            End Try

I hope this helps?


Solution

  • I can't see all your code, but this is an example about adding a list of objects of type cmbItem to a DataGridViewComboBoxColumn

    Public Class Form1
    Dim myItems As New List(Of cmbItem)
    
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        myItems.Add(New cmbItem() With {.Text = "yesterday", .DisplayText = Now.Date.AddDays(-1).ToString()})
        myItems.Add(New cmbItem() With {.Text = "now", .DisplayText = Now.Date.ToString()})
        myItems.Add(New cmbItem() With {.Text = "tomorrow", .DisplayText = Now.Date.AddDays(1).ToString()})
    
    
        'find combobox in datagridview, passing column index
        Dim ss = CType(DataGridView1.Columns(1), DataGridViewComboBoxColumn)
    
        'add my items to combobox
        For Each cmbItem As cmbItem In myItems
            ss.Items.Add(cmbItem)
        Next
    
        'set combobox properties
        ss.ValueMember = "Text"
        ss.DisplayMember = "DisplayText"
    End Sub
    
    End Class
    
    Public Class cmbItem
        Property Text() As String
        Property DisplayText() As String
    End Class
    

    Result:

    enter image description here

    If you want to add a new row, you must be sure to add a valid combobox value in the comboboxColumn. In the following code...

    Private Sub AddRow()
        DataGridView1.Rows.Add(New Object() {"New", myItems.First()})
        DataGridView1.Rows.Add(New Object() {"New", "12/01/1984"})
    End Sub
    

    The first row is added correctly, the second one gives and exception like yours "DataGridViewComboBoxCell value is not valid."

    enter image description here

    There are a lot of ways to add new rows getting a valid combobox item, here are some examples

    Private Sub AddRow2()
        Dim ss = CType(DataGridView1.Columns(1), DataGridViewComboBoxColumn)
    
        'adding from my list
        DataGridView1.Rows.Add(New Object() {"New", myItems.First()})
    
    
        'adding from current combobox Items
        DataGridView1.Rows.Add(New Object() {"New", ss.Items.OfType(Of cmbItem).Last()})
    
    
        'querying from combobox added items
        Dim queryItem = (From i In ss.Items.OfType(Of cmbItem)() _
                        Where i.Text = "now" _
                        Select i).Single()
    
        DataGridView1.Rows.Add(New Object() {"New", queryItem})
    
    End Sub
    

    Result

    enter image description here