with net example ejemplos databind data .net winforms data-binding datagridview

.net - net - Enlace a DataGridView: ¿hay alguna manera de "enlazar" el color de fondo de una celda?



datagridview datasource c# (2)

Estoy vinculando una Lista a un DataGridView. Una propiedad de la clase SomeObject será un código de estado (por ejemplo, Rojo, Amarillo, Verde). ¿Puedo "vincular" el estado al color de fondo de una celda fácilmente? ¿Qué tal el enlace a una información sobre herramientas también?


Fuera de la caja, cualquier DataGridViewColumn puede vincularse a una sola propiedad de los objetos en el DataSource, el nombre de la propiedad será dado por el DataPropertyName de cada DataGridViewColumn (usted tendrá tipos de columna específicos como: DataGridViewTextBoxColumn, ...) .

Puede usar el evento DataGridView.CellFormatting para cambiar el estilo de la celda dependiendo del elemento de datos. En el cuadro DataGridViewCellFormattingEventArgs de este evento, se obtiene el índice de la fila, desde allí se puede obtener el objeto actual (el origen de la fila). A partir de ahí, puede usar cualquier propiedad del objeto para influenciar su celda.

Un buen punto de partida (idea similar): aquí

Una segunda idea sería desarrollar tu propio tipo DataGridViewColumn y agregar propiedades para otras cosas que necesitas vincular. Por ejemplo, de la misma manera que tiene el nombre DataPropertyName incorporado, puede agregar el suyo propio: BackgroundColorPropertyName. Aquí se puede encontrar un punto de partida para construir DataGridViewColumns personalizados.


Puede escribir un controlador para el evento CellFormatting de DataGridView para personalizar el color de fondo. Aquí hay un ejemplo trabajado (deberá arrastrar un DataGridView al Formulario predeterminado y luego hacer doble clic en el evento CellFormatting para crear un controlador):

using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private BindingSource _source = new BindingSource(); public Form1() { InitializeComponent(); _source.Add(new MyData(Status.Amber, "Item A")); _source.Add(new MyData(Status.Red, "Item B")); _source.Add(new MyData(Status.Green, "Item C")); _source.Add(new MyData(Status.Green, "Item D")); dataGridView1.DataSource = _source; dataGridView1.Columns[0].Visible = false; } private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (e.ColumnIndex == 1) { DataGridView dgv = sender as DataGridView; MyData data = dgv.Rows[e.RowIndex].DataBoundItem as MyData; switch (data.Status) { case Status.Green: e.CellStyle.BackColor = Color.Green; break; case Status.Amber: e.CellStyle.BackColor = Color.Orange; break; case Status.Red: e.CellStyle.BackColor = Color.Red; break; } } } } public class MyData { public Status Status { get; set; } public string Text { get; set; } public MyData(Status status, string text) { Status = status; Text = text; } } public enum Status { Green, Amber, Red } }

Los objetos aquí solo tienen un Estado y Texto por simplicidad. Creo un BindingSource para un conjunto de ejemplos de estos objetos, luego lo uso como fuente de datos para DataGridView. De forma predeterminada, la cuadrícula genera automáticamente columnas cuando se vincula, por lo que no es necesario hacerlo manualmente. También oculto la primera columna, que está vinculada al valor de estado, ya que vamos a colorear las celdas de texto en su lugar.

Para realmente hacer la pintura, respondemos al evento CellFormatting. Obtenemos una referencia a DataGridView enviando remitente, luego usamos la propiedad RowIndex del objeto DataGridViewCellFormattingEventArgs para obtener el ítem de datos en sí mismo (cada Fila tiene una propiedad DataBoundItem que nos proporciona esto convenientemente). Como DataBoundItem es un tipo de objeto, necesitamos convertirlo a nuestro tipo específico, entonces podemos llegar a la propiedad Estado en sí ... ¡phew!

No he tenido ninguna experiencia con la programación de información sobre herramientas, pero pensé que debería responder al evento MouseHover, y luego trabajar para descubrir a qué fila se apunta para empezar.

Espero que esto ayude.