2008-10-14 30 views
7

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?Cómo cambiar el estilo de ComboBox de celda en DataGridViewComboBoxColumn

Respuesta

4
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

+0

Este es única 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. – chgman

2

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; 
     } 
    } 
} 
+0

la condición dada, si siempre resulta ser cierto en mi cuadro combinado databounded ... hay un trabajo alrededor ... condición dada: ================= =============================================== if (! Column1.Items.Contains (e.FormattedValue.ToString())) { Column1.Items.Add (e.FormattedValue); dataGridView1.Rows [e.RowIndex] .Cells [e.ColumnIndex] .Value = e.FormattedValue; } –

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

puede volver siempre cierto porque Column1.Items.Contains() es la búsqueda de String valores. si e.FormattedValue no es String, entonces 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; 
} 
Cuestiones relacionadas