web-dev-qa-db-fra.com

DataGridView change la couleur de fond de la cellule

J'ai le code suivant :

private void dgvStatus_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
    foreach (DataGridViewRow row in dgvStatus.Rows)
    {
        row.Cells[color.Index].Style.BackColor = Color.FromArgb(((GesTest.dsEssais.FMstatusAnomalieRow)row.DataBoundItem).iColor);
    }
}

J'essaie de définir la couleur d'arrière-plan de chaque cellule à partir de la colonne de couleur d'arrière-plan. cela ne fonctionne pas la couleur ne change jamais. Une idée de pourquoi?

J'ai regardé autour de moi mais je n'ai rien trouvé d'utile

14
Rémi

J'ai finalement réussi à le faire fonctionner. Voici le code:

private void dgvStatus_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (e.ColumnIndex != color.Index)
        return;

    e.CellStyle.BackColor = Color.FromArgb(int.Parse(((DataRowView)dgvStatus.Rows[e.RowIndex].DataBoundItem).Row[4].ToString()));
}

si quelqu'un sait mieux faire cela, n'hésitez pas à le poster. Je suis ouvert à la suggestion

15
Rémi

Créez simplement un nouvel objet DataGridViewCellStyle , définissez sa couleur de fond puis affectez-lui le style de la cellule:

    DataGridViewCellStyle style = new DataGridViewCellStyle();
    style.BackColor = Color.FromArgb(((GesTest.dsEssais.FMstatusAnomalieRow)row.DataBoundItem).iColor);
    style.ForeColor = Color.Black;
    row.Cells[color.Index].Style = style;
27
Jeb

Si vous êtes toujours intéressé par pourquoi cela n'a pas fonctionné pour vous au début:

Si vous ne voyez pas les modifications que vous avez apportées au style de la cellule, c'est parce que vous avez effectué ces modifications avant le formulaire a été affiché, de sorte qu'elles ne sont pas prises en compte.

Changer les styles de cellule dans les événements suggérés ici fera l'affaire, mais on les appelle plusieurs fois, ce qui entraîne des changements de style plus fréquents que vous le souhaitez et ne sont donc pas très efficaces.

Pour résoudre ce problème, modifiez le style après le point de votre code dans lequel le formulaire est affiché ou abonnez-vous à l'événement Shown et placez-y vos modifications (cet événement est appelé beaucoup moins que les autres événements suggérés).

9
Ysch
dataGridView1.Rows[i].Cells[7].Style.BackColor = Color.LightGreen;
4
Serkan Acuner
int rowscount = dataGridView1.Rows.Count;         

for (int i = 0; i < rowscount; i++)
{            
    if (!(dataGridView1.Rows[i].Cells[8].Value == null))
    {
        dataGridView1.Rows[i].Cells[8].Style.BackColor = Color.LightGoldenrodYellow;
    }
}
2
Serkan Acuner
protected void grdDataListeDetay_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (e.Row.Cells[3].Text != "0")
        {
            for (int i = 0; i <= e.Row.Cells.Count - 1; i++)
            {
                e.Row.Cells[i].BackColor = System.Drawing.Color.Beige;
            }
        }
    }
}
0
ertugrulakdag

essayez ce qui suit (dans la méthode RowDataBound de GridView): 

protected void GridViewUsers_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // this will only change the rows backgound not the column header 

    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        e.Row.Cells[0].BackColor = System.Drawing.Color.LightCyan; //first col
        e.Row.Cells[1].BackColor = System.Drawing.Color.Black; // second col
    }
}
0
Awaidus
dataGridView1[row, col].Style.BackColor = System.Drawing.Color.Red;
0
sailfish009