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?
Respuesta
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.
Buena respuesta - gracias. – xyz
+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
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
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.
- 1. Fondo de celda WGT DataGrid utilizando el enlace
- 2. ¿Hay alguna manera de hacer que TFS se pueda enlazar?
- 3. Jqgrid establecer color de fondo de celda
- 4. ¿Hay alguna manera de eliminar el fondo gris de ImageButtons?
- 5. Devuelve el color de fondo de la celda seleccionada
- 6. Configuración de POI Fondo de celda a un color personalizado
- 7. Cambiar el color del botón en la celda DataGridView
- 8. El color de fondo de la fila DataGridView no cambia
- 9. Actualizar el color de fondo de la celda DatagridView en base a los datos de la fila
- 10. Establecer el color de la celda de fondo en PHPExcel
- 11. ¿Hay alguna manera de obtener atribución para una imagen de fondo en la capa de presentación?
- 12. La asignación de un color de fondo a una célula, dada una condición en otra celda
- 13. ¿Hay alguna manera de lograr el enlace de datos múltiples para un solo elemento en KnockoutJS?
- 14. ¿Hay alguna manera de desactivar una etiqueta?
- 15. Suite XtraGrid: ¿hay alguna manera de agregar un botón o hipervínculo a una celda?
- 16. ¿Hay alguna forma de determinar el color de fondo de un terminal?
- 17. ¿Cuál es una manera simple de establecer el color de la celda de fondo para un CustomGrid?
- 18. C color de fondo # WinForms DataGridView haciendo demasiado lento
- 19. Fondo de celda y accesorio
- 20. ¿Cómo usar el relleno para el color de fondo de una celda excel usando C#?
- 21. Excel: Conjunto color de fondo de la celda con el valor RGB de los datos en la celda
- 22. DataGridView: centrar una celda específica
- 23. WinForms - DataGridView - sin celda seleccionada
- 24. Cómo enlazar la lista a dataGridView?
- 25. Celda de Datagridview seleccionada después de ClearSelection
- 26. ¿Hay alguna manera de cambiar el color de fuente de Jradiobuttons usando el UImanager
- 27. C# texto multicolor en una sola celda de un datagridview
- 28. ¿Hay alguna manera de llamar a una subfunción en el modo de célula en matlab?
- 29. ¿Cómo establecer el color de celda según el valor de celda en ooo-calc?
- 30. Cómo enlazar el fondo de la ventana con el color de fondo de la ventana de un tema?
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 –