Cómo cambiar el estilo ComboBox de la celda en DataGridViewComboBoxColumn

Las celdas en DataGridViewComboBoxColumn tienen ComboBoxStyle DropDownList. Significa que el usuario solo puede seleccionar valores del menú desplegable. El control subyacente es ComboBox, por lo que puede tener estilo DropDown. ¿Cómo cambio el estilo del cuadro combinado subyacente en DataGridViewComboBoxColumn? O, más general, ¿puedo tener una columna en DataGridView con menú desplegable donde el usuario puede escribir?

7

3 Respuestas

void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e)
{
    if (e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
    {
        DataGridViewComboBoxEditingControl cbo = 
            e.Control as DataGridViewComboBoxEditingControl;
        cbo.DropDownStyle = ComboBoxStyle.DropDown;
    }
}

Problem with combobox and databound datagridview

4
agregado
Esta es solo una idea de la solución. La solución completa requiere una rutina de validación; de lo contrario, DataGridView emitirá una excepción. Una solución útil también suele requerir una lista específica de la celda en el menú desplegable.
agregado el autor chgman, fuente

La siguiente solución funciona para mí

private void dataGridView1_CellValidating(object sender, 
    DataGridViewCellValidatingEventArgs e) 
{
    if (e.ColumnIndex == Column1.Index) 
    {
       //Add the value to column's Items to pass validation
        if (!Column1.Items.Contains(e.FormattedValue.ToString())) 
        {
            Column1.Items.Add(e.FormattedValue);
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = 
                e.FormattedValue;
        }
    }
}

private void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e) 
{
    if (dataGridView1.CurrentCell.ColumnIndex == Column1.Index) 
    {
        ComboBox cb = (ComboBox)e.Control;
        if (cb != null) 
        {
            cb.Items.Clear();
           //Customize content of the dropdown list
            cb.Items.AddRange(appropriateCollectionOfStrings);
            cb.DropDownStyle = ComboBoxStyle.DropDown;
        }
    }
}
2
agregado
la condición dada si siempre resulta ser cierta en mi cuadro combinado con datos desbordados ... ¿hay algún problema ... dada la condición: ====================== ======================================== zwnj; ======= si ( ! Column1.Items.Contains (e.FormattedValue.ToString ())) {Column1.Items.Add (e.FormattedValue); dataGridView1.Rows [e.RowIndex] .Cells [e.ColumnIndex] .Value = e.FormattedValue; }
agregado el autor Asad Malik, fuente
if (!Column1.Items.Contains(e.FormattedValue.ToString())) { 
    Column1.Items.Add(e.FormattedValue);     
    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue; 
}  

siempre puede volverse cierto porque Column1.Items.Contains() está buscando valores String . si e.FormattedValue no es una String , la comparación fallará.

tratar

if (!Column1.Items.Contains(e.FormattedValue.ToString())) { 
    Column1.Items.Add(e.FormattedValue.ToString());     
    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue.ToString(); 
}

o

if (!Column1.Items.Contains(e.FormattedValue)) { 
    Column1.Items.Add(e.FormattedValue); 
    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue; 
}
1
agregado