Search code examples
vb.netdatagridviewdatagridcomboboxcolumn

DataGridComboBoxCell - Can't Fill Values Programmatically


I'm filling a DataGridView with 2 columns, a DataGridViewTextBoxColumn for a name label, and a DataGridViewComboBoxColumn to act as a dropdown for selecting an SQL Column name to map to the name.

I'm going for a loop through my names, and creating a row for each of them. Each row should display the name of a field (String object), and in the other column should be a combo box (values are within a List (Of String)). I keep getting an exception raised that says 'the value is not valid':

For Each sourceColumn As String In sourceColumnList
    Dim item As New DataGridViewTextBoxCell
    Dim destcombo As New DataGridViewComboBoxCell
    item.Value = sourceColumn
    destcombo.Items.AddRange(sqlColumnSelectionList.ToArray())

    '    ERROR IS HERE, REFERRING TO INVALID COMBO BOX |
    '                                                 \|/
    list_Destination_SQLMap.Rows.Add(sourceColumn, destcombo)
Next

I've googled around but can only find examples of how to fix this problem with data sources that are bound, not unbound. I know I'm missing something, this is the first time I've used a DataGridView.


Solution

  • When adding a DataGridViewComboBoxColumn you also need to set its DataSource property to a valid source. A DataTable if you get the data from a database or List (Of T) - Your List (Of String) will work just fine.

    Add the code below AFTER you have created and populated the sqlColumnSelectionList. (Don't forget to change the variable name column2 to whatever you named it)

    column2.DataSource = sqlColumnSelectionList
    

    It is important to remember that the DataGridViewComboBox works just like a normal ComboBox when it comes to initialisation and general usage.

    Once you have that done, when adding rows you should change this line:

    list_Destination_SQLMap.Rows.Add(sourceColumn, destcombo)
    

    to be:

    list_Destination_SQLMap.Rows.Add(sourceColumn, "")
    

    This will add the new row to the DataGridView with an entry in the Text column matching the name of the field (as per your description) and the second column will be blank allowing the user to select the value from the drop down.

    If you need the second column to be pre-selected to a value, replace the empty string with that value.

    The DataGridViewComboBoxColumn only needs to be populated the once, and not every time a new cell is added to the DataGridView.