Question

Je voudrais ajouter une couleur de fond pour une ligne spécifique en fonction d'une propriété de l'objet lié.

La solution que j'ai (et cela fonctionne) consiste à utiliser l'événement DataBindingComplete , mais je ne pense pas que ce soit la meilleure solution.

Voici l'événement:

    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);
            }
        }
    }

Une autre option qui serait meilleure?

Était-ce utile?

La solution

Vous pouvez également attacher un gestionnaire d'événements à 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
    ....
}

Autres conseils

Je ne travaille pas vraiment avec WinForms, mais en ASP, vous utiliseriez la méthode 'ItemDataBound'. Existe-t-il quelque chose de similaire dans les formulaires Windows pour un DataGrid?

Si tel est le cas, dans cette méthode, les arguments d'événement contiendraient l'élément lié aux données, ainsi que la ligne DataGrid. Ainsi, le code général ressemblerait à quelque chose comme ça (la syntaxe est probablement éteinte):

if(((MyObject)e.Item.DataItem).Special)
   e.Item.DefaultCellStyle.BackColor = Color.FromArgb(240, 128, 128);

Je suggérerais quelques petites choses:

  • examinez la modification de vos lignes à l'adresse _OnRowDatabound
  • Ne définissez pas de couleur dans votre code !!! Ce serait une grosse erreur. Utilisez la propriété d'attributs et définissez la classe css. Bravo du doigt aux gens qui le font encore.

Faites-moi savoir si vous avez des difficultés avec la mise en œuvre et je posterai un extrait.

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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top