Search code examples
vb.netdatagridviewdatagridtemplatecolumndatagridcomboboxcolumndatagridviewcomboboxcell

Unbound DataGridView : Need ComboBox In cell of 2nd column only when user clicks cell


I have a unbound DataGridView with two columns. First column is just string values. Second column I want to display a combobox, only when user click the cell(not the whole column as DataGridViewColumn). I use the below code which is incorrect and gives me the error : Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function. The first column is popuated, and the second column is empty.

The code is as below :

Private Sub DGVFieldsMap_CellEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGVFieldsMap.CellEnter
    If e.ColumnIndex = 1 Then
        If cboClmCell Is Nothing Then
            Dim dgv As DataGridView = CType(sender, DataGridView)
            cboClmCell = New DataGridViewComboBoxCell
            cboClmCell.Items.Add("A")
            cboClmCell.Items.Add("B")
            cboClmCell.Items.Add("C")
            cboClmCell.Items.Add("D")
            cboClmCell.Items.Add("E")
            cboClmCell.Items.Add("F")
            dgv.Focus()
            dgv(e.ColumnIndex, e.RowIndex) = cboClmCell '[Error Here]
            isCombo = True
        End If
    End If
End Sub


Private Sub DGVFieldsMap_CellValidating(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) Handles DGVFieldsMap.CellValidating
        If e.ColumnIndex = 1 Then
            Dim dgv As DataGridView = CType(sender, DataGridView)
            If isCombo Then
                isCombo = False
                cboClmCell = Nothing
                dgv(e.ColumnIndex, e.RowIndex) = New DataGridViewTextBoxCell()
            End If
        End If
End Sub

Can anybody give me a complete working example with two columns, the second column being a ComboBoxCell, but only when user clicks. Also I need to get the selected values in the DataGridView cell. Thanks In Advance.


Solution

  • Don't try to replace the columns in event handlers, instead create a DataGridView with 2 columns, have the 2nd column be your DataGridViewComboBoxColumn. There is a property on that column called "DisplayStyle" which determines how the column looks when not editing. Set it to "Nothing". Now it will look like a textbox until you go into edit mode at which point it looks like a combobox.