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?
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:
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."
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