2009-02-25 82 views
12

Tengo un gran control DataGridView que tiene varias celdas, la mayoría de las cuales contienen un botón. ¿Cómo puedo cambiar el color de esos botones?Cambiar el color del botón en la celda DataGridView

Esto cambia el "contorno" del botón pero no el botón en sí.

row.Cells[2].Style.BackColor = System.Drawing.Color.Red; 

Esto no parece cambiar algo que es visible:

row.Cells[2].Style.ForeColor = System.Drawing.Color.Red; 

Si no es posible cambiar el fondo, es posible cambiar el tipo de letra en el botón?

Usando .NET 2.0.

Respuesta

13

Según MSDN:

Cuando estilos visuales están habilitados, los botones en una columna de botón están pintadas utilizando un ButtonRenderer y teléfonos estilos especificado a través de las propiedades como DefaultCellStyle no tienen efecto .

Por lo tanto, tiene una de dos opciones. En sus Program.cs puede quitar esta línea:

Application.EnableVisualStyles(); 

que hacer que funcione, pero que todo lo demás parece la mierda. Su otra opción, y no le va a gustar, es heredar de DataGridViewButtonCell y anular el método Paint(). A continuación, puede utilizar el método estático en la clase ButtonRenderer llamada DrawButton, para pintar el botón usted mismo. Eso significa averiguar en qué estado se encuentra actualmente la célula (hacer clic, desplazarse, etc.) y pintar las esquinas y los bordes, etc. ... Se entiende la idea, es factible, pero un dolor ENORME.

Si desea embargo, aquí sólo algunos ejemplos de código para empezar:

//Custom ButtonCell 
public class MyButtonCell : DataGridViewButtonCell 
    { 
     protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) 
     { 
      ButtonRenderer.DrawButton(graphics, cellBounds, formattedValue.ToString(), new Font("Comic Sans MS", 9.0f, FontStyle.Bold), true, System.Windows.Forms.VisualStyles.PushButtonState.Default); 
     } 
    } 

Entonces aquí está un DataGridView prueba:

DataGridViewButtonColumn c = new DataGridViewButtonColumn(); 
      c.CellTemplate = new MyButtonColumn(); 
      this.dataGridView1.Columns.Add(c); 
      this.dataGridView1.Rows.Add("Click Me"); 

Todo esto muestra no, es pintar un botón con la fuente es "Comic Sans MS". No tiene en cuenta el estado del botón como lo verá cuando ejecuta la aplicación.

GOOD LUCK !!

+0

En mi caso, tuve que representar otras partes del botón también de las celdas, es decir, líneas de cuadrícula, etc. Como una solución rápida y sucia, puede llamar a base.Pintura (...), los grupos de celdas DEFLATE por un par de píxel (para asegurarse de que el área alrededor del botón se mantendrá), y luego llamar a ButtonRenderer.DrawButton – Alex

1

Si estas celdas contienen un botón, estoy bastante seguro de que tiene que acceder a la propiedad de ese botón BackColor. Es decir. obtener el valor de la celda convertirlo en un botón y establecer su propiedad.

+1

Sí, la propiedad BackColor está allí y cambia el contorno del botón, no el botón en sí. De hecho tuve que cambiar el FlatStyle del botón a "Popup" o "Flat" para que funcione. – Dave

0

creo que está accediendo mal:

row.Cells[2].Style.BackColor = System.Drawing.Color.Red; 

que dicen actualiza el "esquema" del botón, pero en realidad es la actualización de la celda detrás del botón.

algo como esto debería funcionar:

row.Cells[2].ButtonName.Style.BackColor = System.Drawing.Color.Red; 
25

Eché de menos la nota de Dave en la respuesta de Tomas, así que solo estoy publicando la solución simple para esto.

Actualice la propiedad FlatStyle de la columna Botón a Ventana emergente y luego, al actualizar el color de fondo y el color anterior, puede cambiar el aspecto del botón.

DataGridViewButtonColumn c = (DataGridViewButtonColumn)myGrid.Columns["colFollowUp"]; 
c.FlatStyle = FlatStyle.Popup; 
c.DefaultCellStyle.ForeColor = Color.Navy; 
c.DefaultCellStyle.BackColor = Color.Yellow; 
+0

Acabo de tener este problema y su solución me ayudó. ¡Muchas gracias! – NickAldwin

+0

feo, pero funciona sin un montón de basura. –

0

Es absolutamente suficiente para hacer su propia clase derivada de DataGridViewButtonCell con un método personalizado Paint, sin quitar EnableVisualStyles().

1

El botón predeterminado en un DataGridView se dibuja utilizando el ButtonRenderer, lo que hace que sea bastante difícil anular. si yo fuera tú, simplemente pondría el botón FlatStyle en "Popup".

DataGridViewButtonCell buttonCell = (DataGridViewButtonCell)dataGridMappings.Rows[0].Cells[0]; 
buttonCell.FlatStyle = FlatStyle.Popup; 
buttonCell.Style.BackColor = System.Drawing.Color.Red; 
Cuestiones relacionadas