(DataGridView + Binding) Como linha de cor dependendo do objeto binded?
Pergunta
Eu gostaria de adicionar um backcolor para linha específica dependendo de uma propriedade do objeto binded.
A solução que eu (e funciona) é usar o DataBindingComplete
evento, mas eu não acho que é a melhor solução.
Aqui é o evento:
private void myGrid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
for (int i = 0; i < this.myGrid.Rows.Count; i++)
{
if((this.myGrid.Rows[i].DataBoundItem as MyObject).Special)
{
this.myGrid.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(240, 128, 128);
}
}
}
Qualquer outra opção que seria melhor?
Solução
Você também pode anexar um manipulador de eventos para RowPostPaint:
dataGridView1.RowPostPaint += OnRowPostPaint;
void OnRowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
{
MyObject value = (MyObject) dataGridView1.Rows[e.RowIndex].DataBoundItem;
DataGridViewCellStyle style = dataGridView1.Rows[e.RowIndex].DefaultCellStyle;
// Do whatever you want with style and value
....
}
Outras dicas
Eu realmente não trabalho com WinForms que muito, mas em ASP você usaria o método 'ItemDataBound'. Existe algo semelhante no Windows Forms para um DataGrid?
Se assim for, em que o método, os argumentos do evento deve conter o item que foi databound, juntamente com a linha DataGrid. Assim, o código geral seria algo parecido com isto (a sintaxe é provavelmente off):
if(((MyObject)e.Item.DataItem).Special)
e.Item.DefaultCellStyle.BackColor = Color.FromArgb(240, 128, 128);
Gostaria de sugerir algumas coisas:
- olhada modificando suas linhas de _OnRowDatabound
- não definir a cor em seu código !!! Este seria um grande erro. Use a propriedade atributos e definir o cssclass. Wag do dedo para as pessoas ainda fazer isso.
Deixe-me saber se você luta com a implementação e eu vou postar um trecho.
private void myGrid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewRow row in myGrid.Rows)
{
if((row.DataBoundItem as MyObject).Special)
{
row.DefaultCellStyle.BackColor = Color.FromArgb(240, 128, 128);
}
}
}