2012-01-03 7 views
22

¿Hay alguna manera fácil de desactivar/grisar un DataGridView? Por ejemplo cuando se haceDesactivar o encadenar un DataGridView

dgv.Enabled = false 

La aparición de la DGV no cambia. He visto personas añadiendo lo siguiente:

dgv.forecolor = gray 
dgv.columnheader.forecolor = gray 

Sin embargo, esto parece torpe. ¿Hay una mejor manera?

Respuesta

14

Respuesta simple a su pregunta: no, no hay una mejor manera.

MSDN no dice mucho sobre el tema, pero los foros están llenos. Configurar manualmente el color de fondo en Gris es cómo la mayoría de las personas se ven "desactivadas" en el DGV.

+6

Respete los colores del sistema y use 'SystemColors.Control' no con un gris codificado. – MarkJ

+4

todos aceptan el gris claro como deshabilitado. eso es universal. – Timmerz

0

¿La configuración de ReadOnly = false altera la apariencia? Pensé que posiblemente eso desactivó las partes "clicables" de la etiqueta de datos, como los encabezados de las columnas ... pero aún se pueden ver los datos en ella.

+0

Buen punto - sin embargo, no, la apariencia sigue siendo la misma. Esto solo evita las modificaciones de la celda afaik – Jeb

0

Supongo que desea que la vista de tabla de datos muestre información al usuario y le niegue al usuario la posibilidad de modificarla de cualquier forma.

private void IntializeDataGridView() 
    { 
    dataGridViewTest.ReadOnly = true; 
    // you can code permissions or colors as well 
    dataGridViewTest.AllowUserToAddRows = false; 
    dataGridViewTest.AllowUserToDeleteRows = false; 
    dataGridViewTest.AllowUserToOrderColumns = false; 
    dataGridViewTest.BackgroundColor = Color.LightGray; 
    //so on and so forth 
    } 

Espero que esto ayude. :]

+0

Gracias, estoy más interesado en el aspecto visual del control cuando está deshabilitado para una señal visual; el mismo comportamiento al deshabilitar botones, etc. – Jeb

+0

¿Estás hablando de cambiar los colores de las columnas y los botones de las celdas? ¿Podrías ser un poco más específico? No creo que entiendo bien. – javasocute

+0

En realidad, creo que sí sé. Pero desafortunadamente, no creo que en C# haya una manera más fácil. Lo que tendrá que hacer es llamar a una función de JavaScript que lo atenuará. – javasocute

3

El solo hecho de configurar el color gris para el encabezado no lo cambiará. También necesita cambiar EnableHeadersVisualStyles a falso.

dgv.ForeColor = Color.Gray; 
dgv.ColumnHeadersDefaultCellStyle.ForeColor = Color.Gray; 
dgv.EnableHeadersVisualStyles = false; 
+1

Si aún desea ver el texto del encabezado, pero lo tiene "ver" deshabilitado, use 'dgv.ColumnHeadersDefaultCellStyle.ForeColor = SystemColors.ControlDark;'. –

15
Private Sub DataGridView1_EnabledChanged(sender As Object, e As EventArgs) Handles DataGridView1.EnabledChanged 
    If Not DataGridView1.Enabled Then 
     DataGridView1.DefaultCellStyle.BackColor = SystemColors.Control 
     DataGridView1.DefaultCellStyle.ForeColor = SystemColors.GrayText 
     DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = SystemColors.Control 
     DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = SystemColors.GrayText 
     DataGridView1.CurrentCell = Nothing 
     DataGridView1.ReadOnly = True 
     DataGridView1.EnableHeadersVisualStyles = False 
    Else 
     DataGridView1.DefaultCellStyle.BackColor = SystemColors.Window 
     DataGridView1.DefaultCellStyle.ForeColor = SystemColors.ControlText 
     DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = SystemColors.Window 
     DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = SystemColors.ControlText 
     DataGridView1.ReadOnly = False 
     DataGridView1.EnableHeadersVisualStyles = True 
    End If 
End Sub 
+1

También tuve que agregar DefaultCellStyle.SelectionBackColor a la lista de elementos configurados en Control de color o la primera celda en la grilla se mostraría con un fondo blanco. –

1

Entiendo que esto es un resuelto uno, pero quieren evitar la pérdida de 1 hora, por alguna otra persona.

//C# version for buttons also. Inspired by sveilleux2. 
private void DataGridView1_EnabledChanged(object sender, EventArgs e){ 
if (!DataGridView1.Enabled){ 
    DataGridView1.DefaultCellStyle.BackColor = SystemColors.Control; 
    DataGridView1.DefaultCellStyle.ForeColor = SystemColors.GrayText; 
    DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = SystemColors.Control; 
    DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = SystemColors.GrayText; 
    //Disable two colums of buttons 
    for (int i = 0; i < DataGridView1.RowCount; i++){ 
     DataGridViewButtonCell buttonCell = (DataGridViewButtonCell)DataGridView1.Rows[i].Cells[1]; 
     buttonCell.FlatStyle = FlatStyle.Popup; 
     buttonCell.Style.ForeColor = SystemColors.GrayText; 
     buttonCell.Style.BackColor = SystemColors.Control; 
     DataGridViewButtonCell buttonCell_2 = (DataGridViewButtonCell)DataGridView1.Rows[i].Cells[6]; 
     buttonCell_2.FlatStyle = FlatStyle.Popup; 
     buttonCell_2.Style.ForeColor = SystemColors.GrayText; 
     buttonCell_2.Style.BackColor = SystemColors.Control; 
    } 

    DataGridView1.Columns[1].DefaultCellStyle.ForeColor = SystemColors.GrayText; 
    DataGridView1.Columns[1].DefaultCellStyle.BackColor = SystemColors.Control; 
    DataGridView1.ReadOnly = true; 
    DataGridView1.EnableHeadersVisualStyles = false; 
    DataGridView1.CurrentCell = null; 
}else{ 
    DataGridView1.DefaultCellStyle.BackColor = SystemColors.Window; 
    DataGridView1.DefaultCellStyle.ForeColor = SystemColors.ControlText; 
    DataGridView1.ColumnHeadersDefaultCellStyle.BackColor = SystemColors.Window; 
    DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor = SystemColors.ControlText; 
    DataGridView1.ReadOnly = false; 
    DataGridView1.EnableHeadersVisualStyles = false; 

    //Enable two colums of buttons 
    for (int i = 0; i < DataGridView1.RowCount; i++){ 
     DataGridViewButtonCell buttonCell = (DataGridViewButtonCell)DataGridView1.Rows[i].Cells[1]; 
     buttonCell.FlatStyle = FlatStyle.Standard; 
     DataGridViewButtonCell buttonCell_2 = (DataGridViewButtonCell)DataGridView1.Rows[i].Cells[6]; 
     buttonCell_2.FlatStyle = FlatStyle.Standard; 
    } 
} 

} ejemplo

1

de sveilleux2, sólo en C# (que es la etiqueta) y avanzado (le permite poner en cualquier nombre y cualquier número de DataGridViews)

private void DataGridView_EnabledChanged(object sender, EventArgs e) 
    { 
     DataGridView dgv = sender as DataGridView; 
     if (!dgv.Enabled) { 
      dgv.DefaultCellStyle.BackColor = SystemColors.Control; 
      dgv.DefaultCellStyle.ForeColor = SystemColors.GrayText; 
      dgv.ColumnHeadersDefaultCellStyle.BackColor = SystemColors.Control; 
      dgv.ColumnHeadersDefaultCellStyle.ForeColor = SystemColors.GrayText; 
      dgv.CurrentCell = null; 
      dgv.ReadOnly = true; 
      dgv.EnableHeadersVisualStyles = false; 
     } 
     else { 
      dgv.DefaultCellStyle.BackColor = SystemColors.Window; 
      dgv.DefaultCellStyle.ForeColor = SystemColors.ControlText; 
      dgv.ColumnHeadersDefaultCellStyle.BackColor = SystemColors.Window; 
      dgv.ColumnHeadersDefaultCellStyle.ForeColor = SystemColors.ControlText; 
      dgv.ReadOnly = false; 
      dgv.EnableHeadersVisualStyles = true; 
     } 
    } 
0

I Agregaré esto aquí aunque la pregunta sea un poco antigua: lo hice de manera diferente a estos otros anulando el método Paint en el control para dibujar un cuadro transparente. Usé una clase heredada de la base DataGridView y luego proporcioné algunas propiedades adicionales y una anulación para el método OnPaint. También puede hacer esto en el evento Paint, pero yo ya había creado nuestra propia versión del control.

Esto tiene la ventaja de no cambiar el color/formato de fila/celda que ya ha configurado y solo desea atenuar el control cuando está desactivado.

Simplemente configure DisableColor (a negro por ejemplo) para que se atenúe (también puede alterar el canal alfa con la propiedad DisableColorAlpha). De lo contrario, actúa como siempre lo hizo.

/// <summary> 
/// Color used when the grid is disabled 
/// </summary> 
[Category("Appearance"), DefaultValue(typeof(Color), "Transparent"), Description("Color to use when the control is disabled (should be transparent)")] 
public Color DisableColor { get; set; } 

/// <summary> 
/// Color used when the grid is disabled 
/// </summary> 
[Category("Appearance"), DefaultValue(50), Description("Alpha channel value for disabled color (0-255)")] 
public int DisableColorAlpha { get; set; } 

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 

    if (this.Enabled == false && DisableColor != Color.Transparent) 
    { 
     // paint a transparent box -- simulate disable 
     using (Brush b = new SolidBrush(Color.FromArgb(DisableColorAlpha, DisableColor))) 
     { 
      e.Graphics.FillRectangle(b, e.ClipRectangle); 
     } 
    } 
} 
Cuestiones relacionadas