2009-07-07 12 views
11

Estoy fijando un DataGridViewComboBoxColumn así:¿Cómo configuro un DataGridView ComboBoxColumn con un DataSource diferente en cada celda?

var newColumn = new DataGridViewComboBoxColumn() { 
    Name = "abc" 
}; 
newColumn.DataSource = new string[] { "a", "b", "c" }; 
dgv.Columns.Add(newColumn); 

Esto funciona: cada fila tiene un cuadro desplegable en esa columna, poblada con a, b, c.

Sin embargo, ahora me gustaría recortar la lista para ciertas filas. Estoy tratando de establecer la lista por fila como esto:

foreach (DataGridViewRow row in dgv.Rows) { 
    var cell = (DataGridViewComboBoxCell)(row.Cells["abc"]);   
    cell.DataSource = new string[] { "a", "c" };       
} 

Sin embargo, este código no tiene ningún efecto - cada fila sigue mostrando "a", "b", "c".

He intentado reemplazar new string[] con new List<string> y new BindingList<string>, ambos en vano.

También he intentado eliminar el código que establece newColumn.DataSource, pero las listas están vacías.

¿Cómo debo hacer esto correctamente?

Respuesta

20

Los siguientes obras para mí:

DataGridViewComboBoxColumn newColumn = new DataGridViewComboBoxColumn(); 
newColumn.Name = "abc"; 
newColumn.DataSource = new string[] { "a", "b", "c" }; 
dataGridView1.Columns.Add(newColumn); 

foreach (DataGridViewRow row in dataGridView1.Rows) 
{ 
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)(row.Cells["abc"]); 
    cell.DataSource = new string[] { "a", "c" }; 
} 

También puede probar (esto también funciona para mí):

for (int row = 0; row < dataGridView1.Rows.Count; row++) 
{ 
    DataGridViewComboBoxCell cell = 
     (DataGridViewComboBoxCell)(dataGridView1.Rows[row].Cells["abc"]); 
    cell.DataSource = new string[] { "f", "g" }; 
} 
+0

Hmm, eso también funciona para mí, en un proyecto de prueba limpio. Debe ser algo que estoy haciendo de manera diferente ... – Blorgbeard

+3

Bien, el problema tenía que ver con el hecho de que mi DataGridView tenía AutoSizeColumnMode establecido en AllCells. Creo que fue validar los valores de las células antes de que se estableciera su fuente de datos (o algo así). – Blorgbeard

+1

¡Me ayudó con mi problema! – XXXXX

0

Otra opción es tratar de enlace de datos en el nivel de fila. Intente utilizar el evento Evento OnRowDataBound. Luego puede programar programáticamente lo que está en el cuadro combinado basado en el contenido de esa fila.

Por supuesto, esto supone que está conectando su red con databinding.

+2

Estoy enlazando datos, pero esto es winforms, no web. winforms datagridview no parece tener este evento .. – Blorgbeard

Cuestiones relacionadas