2008-12-03 12 views
19

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?Enlace a DataGridView - ¿Hay alguna manera de "enlazar" el color de fondo de una celda?

+0

Realmente espero que obtenga una respuesta a esto, y que es posible, no he sido capaz de resolver esto, configuré el color de fondo después de la unión de datos alterando cada estilo de celda. Desafortunadamente eso es realmente lento :(datagridview1.Rows [1] .Cells [2] .Style.BackColor = Color.Red –

Respuesta

35

Puede escribir un controlador para el evento CellFormatting de DataGridView para personalizar el color de fondo. He aquí un ejemplo práctico (que tendrá que haber arrastrado un DataGridView en el formulario predeterminado y haga 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í sólo tienen un estado y el texto de la 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 pintar, 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 habría pensado que debería responder al evento MouseHover, y luego trabajar para descubrir a qué fila se apunta para empezar.

Espero que esto ayude.

+0

Buena respuesta - gracias. – xyz

+1

+1, Gran respuesta. Encontré que la última fila era una fila vacía, por lo que tenía que verificar si MyData era nulo. Aparte de eso, genial! – Russell

+0

Esto funciona muy bien, solo la pregunta es si hay una manera de hacer esta fila a la vez en lugar de una celda. Solo me pregunto si hay algún golpe de rendimiento cuando tienes Más de 1000 filas, más de 10 columnas – Sint

2

Fuera de la caja, cualquier DataGridViewColumn se puede vincular a una sola propiedad de los objetos en el DataSource, el nombre de la propiedad está dado por el DataPropertyName de cada DataGridViewColumn (tendrá columnas específicas tipo: DataGridViewTextBoxColumn, ...).

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

Un buen punto de partida (idea similar): here

Una segunda idea sería no desarrollar su propio tipo DataGridViewColumn y añadir propiedades para otras cosas que necesita para unirse a. Por ejemplo, de la misma manera que tiene el nombre DataPropertyName incorporado, puede agregar el suyo propio: BackgroundColorPropertyName. Se puede encontrar un punto de partida para compilar DataGridViewColumns personalizado here.

Cuestiones relacionadas