2011-09-16 53 views
5

Tengo un DataGridView con modo de solo lectura establecido en verdadero (no editable) que toma valores de una base de datos en la carga de formulario. Cuando configuro el modo de solo lectura en falso (modo editable), quiero que una columna en particular (por ejemplo, Departamento) sea visible como ComboBox para que pueda seleccionar valores desde allí. Y cuando entro al modo de solo lectura, el ComboBox debería desaparecer y DataGridView debería estar visible de forma normal. ¿Cómo lograrlo? Estoy usando C# framework 4.0, WinformsComboBox en DatagridView en el modo de edición

+0

¿Qué quiere decir 'disappear'? ¿Desea que se oculte toda la columna o que se deshabilite el cuadro combinado (es decir, el usuario no puede seleccionar la lista desplegable del cuadro combinado? – SwDevMan81

+0

Quiero decir, la vista de tabla de datos está en su modo normal y el cuadro combinado aparece pero no la columna . – Sandy

Respuesta

4

Consulte la implementación en ComboBox with read only behavior.

También podría cambiar el DisplayStyle en función de cuando se cambia el solo de la propiedad DataGridView. Establecer el DisplayStyle en DataGridViewComboBoxDisplayStyle.Nothing ocultará el botón desplegable.

Por ejemplo, el cambio de la propiedad ReadOnly con un clic de botón sería algo como esto:

private void mChangeReadOnlyButton_Click(object sender, EventArgs e) 
{ 
    ComboBoxColumn2.DisplayStyle = (dataGridView1.ReadOnly) ? 
     DataGridViewComboBoxDisplayStyle.ComboBox : 
     DataGridViewComboBoxDisplayStyle.Nothing; 
    dataGridView1.ReadOnly = !dataGridView1.ReadOnly; 
} 

editable:

Editable http://i51.tinypic.com/5e7o1w.jpg

de sólo lectura:

ReadOnly http://i52.tinypic.com/1zgaxyt.jpg

+0

tengo mi solución de hecho, pero realmente lo siento, lo eliminé por error. y lo restauré ahora. Perdon por el problema. Pero en mi solución estoy enfrentando un problema, cuando mi rowindex y columnindex son los mismos. tu solución funciona bien para mí Gracias. – Sandy

1

Encontré la solución a mi problema, solo pensé en publicarlo aquí. Al ingresar al modo de edición, ejecutar el siguiente código puede resolver el problema.

public void bgCombo(DataGridView dg) 
{ 
    foreach (DataGridViewRow row in dg.Rows) 
    { 
     DataGridViewComboBoxCell dgc = new DataGridViewComboBoxCell(); 
     dgc.Value = row.Cells["Department"].Value; 
     row.Cells["Department"] = dgc; 
    } 
} 

Antes de configurar dgc a dataGridCell podemos agregar colecciones de elementos en él. Espero eso ayude.

PROBLEMA: Si el índice de columnas y filas se convierte en el mismo durante la edición, aparece un error: la operación no es válida porque da como resultado una llamada de reentrada a la función SetCurrentCellAddressCore.

+0

Me encanta esta publicación. Todo lo demás que encontré en la red fue largo y confuso y no es lo que estaba buscando. LIFE SAVER !! :) –

+0

Estoy contento de tener dicho comentario :) – Sandy

1

Si desea ocultar un cuadro combinado para las filas seleccionadas se puede utilizar la propiedad DataGridViewComboBoxDisplayStyle

Las opciones son ComboBox, DropdownBox o Ninguno

En el ejemplo - sólo se mostrará el cuadro combinado en la columna 4 si hay un valor en columna 2

For Each row As DataGridViewRow In dgv.Rows 
     Dim Cell As DataGridViewComboBoxCell = CType(row.Cells(4), DataGridViewComboBoxCell) 
    Cell.ReadOnly = True 
    Cell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing 
    If row.Cells(2).Value IsNot Nothing Then 
     Cell.ReadOnly = False 
     Cell.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox 
    End If 
Next 
Cuestiones relacionadas