Estilos de celda en el control DataGridView de formularios Windows Forms

Cada celda del control DataGridView puede tener su propio estilo, como el formato de texto, el color de fondo, el color de primer plano y la fuente. Normalmente, sin embargo, varias celdas compartirán características de estilo determinadas.

Los grupos de celdas que comparten estilos pueden incluir todas las celdas en filas o columnas concretas, todas las celdas que contienen valores concretos o todas las celdas del control. Dado que estos grupos se superponen, cada celda puede obtener su información de estilo de más de un lugar. Por ejemplo, es posible que desee que todas las celdas de un control DataGridView usen la misma fuente, pero que solo las celdas de las columnas de moneda usen el formato de moneda y solo las celdas de moneda con números negativos usen un color de primer plano rojo.

The DataGridViewCellStyle Class

La clase DataGridViewCellStyle contiene las siguientes propiedades relacionadas con el estilo visual:

Esta clase también contiene las siguientes propiedades relacionadas con el formato:

Para obtener más información sobre estas propiedades y otras propiedades de estilo de celda, consulte la documentación de referencia de DataGridViewCellStyle y los temas enumerados en la sección Vea también a continuación.

Using DataGridViewCellStyle Objects

Puede recuperar objetos DataGridViewCellStyle de varias propiedades de las clases DataGridView, DataGridViewColumn, DataGridViewRow y DataGridViewCell, y sus clases derivadas. Si aún no se ha establecido una de estas propiedades, al recuperar su valor se creará un nuevo objeto DataGridViewCellStyle. También puede crear instancias de sus propios objetos DataGridViewCellStyle y asignarlos a estas propiedades.

Puede evitar la duplicación innecesaria de la información de estilo compartiendo objetos DataGridViewCellStyle entre varios elementos DataGridView. Dado que los estilos establecidos en los niveles de control, columna y fila se filtran a través de cada nivel por el nivel de celda, también puede evitar la duplicación de estilos estableciendo solo esas propiedades de estilo en cada nivel que difieren de los niveles anteriores. Esto se describe con más detalle en la sección Herencia de estilo siguiente.

En la tabla siguiente se enumeran las propiedades principales que obtienen o establecen objetos DataGridViewCellStyle.

Propiedad Clases Descripción
DefaultCellStyle DataGridView, DataGridViewColumn, DataGridViewRow y clases derivadas Obtiene o establece los estilos predeterminados utilizados por todas las celdas del control completo (incluidas las celdas de encabezado), en una columna o en una fila.
RowsDefaultCellStyle DataGridView Obtiene o establece los estilos de celda predeterminados utilizados por todas las filas del control. Esto no incluye celdas de encabezado.
AlternatingRowsDefaultCellStyle DataGridView Obtiene o establece los estilos de celda predeterminados utilizados al alternar filas en el control. Se usa para crear un efecto de doble carta.
RowHeadersDefaultCellStyle DataGridView Obtiene o establece los estilos de celda predeterminados utilizados por los encabezados de fila del control. Se reemplaza por el tema actual si están habilitados los estilos visuales.
ColumnHeadersDefaultCellStyle DataGridView Obtiene o establece los estilos de celda predeterminados utilizados por los encabezados de columna del control. Se reemplaza por el tema actual si están habilitados los estilos visuales.
Style DataGridViewCell y clases derivadas Obtiene o establece los estilos especificados en el nivel de celda. Estos estilos invalidan los heredados de niveles superiores.
InheritedStyle DataGridViewCell, DataGridViewRow, DataGridViewColumn y clases derivadas Obtiene todos los estilos aplicados actualmente a la celda, fila o columna, incluidos los estilos heredados de niveles superiores.

Como se ha mencionado antes, al obtener el valor de una propiedad de estilo se crea automáticamente una instancia de un nuevo objeto DataGridViewCellStyle si la propiedad no se ha establecido previamente. Para evitar crear estos objetos innecesariamente, las clases de fila y columna tienen una propiedad HasDefaultCellStyle que puede comprobar para determinar si se ha establecido la propiedad DefaultCellStyle. Del mismo modo, las clases de celda tienen una propiedad HasStyle que indica si se ha establecido la propiedad Style.

Cada una de las propiedades de estilo tiene un evento PropertyNameChanged correspondiente en el control DataGridView. Para las propiedades de fila, columna y celda, el nombre del evento comienza por "Row", "Column" o "Cell" (por ejemplo, RowDefaultCellStyleChanged). Cada uno de estos eventos se produce cuando la propiedad de estilo correspondiente se establece en un objeto DataGridViewCellStyle diferente. Estos eventos no se producen al recuperar un objeto DataGridViewCellStyle de una propiedad de estilo y modificar sus valores de propiedad. Para responder a los cambios en los propios objetos de estilo de celda, controle el evento CellStyleContentChanged.

Herencia de estilo

Cada clase DataGridViewCell obtiene su apariencia de su propiedad InheritedStyle. El objeto DataGridViewCellStyle devuelto por esta propiedad hereda sus valores de una jerarquía de propiedades de tipo DataGridViewCellStyle. Estas propiedades se enumeran a continuación en el orden en que la propiedad InheritedStyle para celdas que no son de encabezado obtienen sus valores.

  1. DataGridViewCell.Style

  2. DataGridViewRow.DefaultCellStyle

  3. DataGridView.AlternatingRowsDefaultCellStyle (solo para celdas en filas con números de índice impares)

  4. DataGridView.RowsDefaultCellStyle

  5. DataGridViewColumn.DefaultCellStyle

  6. DataGridView.DefaultCellStyle

Para las celdas de encabezado de fila y columna, la propiedad InheritedStyle se rellena mediante valores de la siguiente lista de propiedades de origen en el orden especificado.

  1. DataGridViewCell.Style

  2. DataGridView.ColumnHeadersDefaultCellStyle o DataGridView.RowHeadersDefaultCellStyle

  3. DataGridView.DefaultCellStyle

En el siguiente diagrama se muestra este proceso.

Propiedades de tipo DataGridViewCellStyle

También puede acceder a los estilos heredados por filas y columnas específicas. La propiedad InheritedStyle de columna hereda sus valores de las siguientes propiedades.

  1. DataGridViewColumn.DefaultCellStyle

  2. DataGridView.DefaultCellStyle

La propiedad InheritedStyle de fila hereda sus valores de las siguientes propiedades.

  1. DataGridViewRow.DefaultCellStyle

  2. DataGridView.AlternatingRowsDefaultCellStyle (solo para celdas en filas con números de índice impares)

  3. DataGridView.RowsDefaultCellStyle

  4. DataGridView.DefaultCellStyle

Para cada propiedad de un objeto DataGridViewCellStyle devuelto por una propiedad InheritedStyle, el valor de propiedad se obtiene del primer estilo de celda de la lista adecuada que tiene la propiedad correspondiente establecida en un valor distinto de los valores predeterminados de la clase DataGridViewCellStyle.

En la tabla siguiente se muestra cómo se hereda el valor de propiedad ForeColor de una celda de ejemplo de su columna contenedora.

Propiedad de tipo DataGridViewCellStyle Valor ForeColor de ejemplo del objeto recuperado
DataGridViewCell.Style Color.Empty
DataGridViewRow.DefaultCellStyle Color.Red
DataGridView.AlternatingRowsDefaultCellStyle Color.Empty
DataGridView.RowsDefaultCellStyle Color.Empty
DataGridViewColumn.DefaultCellStyle Color.DarkBlue
DataGridView.DefaultCellStyle Color.Black

En este caso, el valor Color.Red de la fila de la celda es el primer valor real de la lista. Se convierte en el valor de propiedad ForeColor de la propiedad InheritedStyle de la celda.

En el diagrama siguiente se muestra cómo las diferentes propiedades DataGridViewCellStyle pueden heredar sus valores de distintos lugares.

Herencia de valores de propiedad de DataGridView

Al aprovechar la herencia de estilo, puede proporcionar estilos adecuados para todo el control sin tener que especificar la misma información en varios lugares.

Aunque las celdas de encabezado participan en la herencia de estilo como se describe, los objetos devueltos por las propiedades ColumnHeadersDefaultCellStyle y RowHeadersDefaultCellStyle del control DataGridView tienen valores de propiedad iniciales que invalidan los valores de propiedad del objeto devuelto por la propiedad DefaultCellStyle. Si desea que las propiedades establecidas para el objeto devuelto por la propiedad DefaultCellStyle se apliquen a los encabezados de fila y columna, debe establecer las propiedades correspondientes de los objetos devueltos por las propiedades ColumnHeadersDefaultCellStyle y RowHeadersDefaultCellStyle en los valores predeterminados indicados para la clase DataGridViewCellStyle.

Nota

Si los estilos visuales están habilitados, el tema actual aplica un estilo automáticamente a los encabezados de fila y columna (excepto TopLeftHeaderCell) y se reemplazan los estilos especificados por estas propiedades.

Los tipos DataGridViewButtonColumn, DataGridViewImageColumn y DataGridViewCheckBoxColumn también inicializan algunos valores del objeto devuelto por la propiedad DefaultCellStyle de columna. Para obtener más información, consulte la documentación de referencia para estos tipos.

Establecimiento dinámico de estilos

Para personalizar los estilos de las celdas con valores concretos, implemente un controlador para el evento DataGridView.CellFormatting. Los controladores para este evento reciben un argumento del tipo DataGridViewCellFormattingEventArgs. Este objeto contiene propiedades que permiten determinar el valor de la celda a la que se va a dar formato junto con su ubicación en el control DataGridView. Este objeto también contiene una propiedad CellStyle que se inicializa en el valor de la propiedad InheritedStyle de la celda a la que se va a dar formato. Puede modificar las propiedades de estilo de celda para especificar la información de estilo adecuada para el valor y la ubicación de la celda.

Nota

Los eventos RowPrePaint y RowPostPaint también reciben un objeto DataGridViewCellStyle en los datos de evento, pero en su caso, es una copia de la propiedad InheritedStyle de fila con fines de solo lectura y los cambios en ella no afectan al control.

También puede modificar dinámicamente los estilos de celdas individuales en respuesta a eventos como DataGridView.CellMouseEnter y CellMouseLeave. Por ejemplo, en un controlador para el evento CellMouseEnter, podría almacenar el valor actual del color de fondo de celda (recuperado a través de la propiedad Style de la celda) y, a continuación, establecerlo en un nuevo color que resaltará la celda cuando se desplace el mouse sobre ella. En un controlador para el evento CellMouseLeave, puede restaurar el color de fondo al valor original.

Nota

El almacenamiento en caché de los valores almacenados en la propiedad Style de la celda es importante independientemente de si se establece un valor de estilo determinado. Si reemplaza temporalmente una configuración de estilo, restaurarla a su estado "no establecido" original garantiza que la celda vuelva a heredar la configuración de estilo de un nivel superior. Si debe determinar el estilo real en vigor para una celda independientemente de si se hereda el estilo, use la propiedad InheritedStyle de la celda.

Consulte también