Modification dynamique de la couleur des cellules de datagridview

j'ai un objet dataGridView qui est rempli de données. Je veux cliquer sur un bouton et une modification de la couleur de l'arrière-plan de la cellule. C'est ce que j'ai actuellement

foreach(DataGridViewRow row in dataGridView1.Rows)
{
    foreach(DataGridViewColumn col in dataGridView1.Columns)
    {
            //row.Cells[col.Index].Style.BackColor = Color.Green; //doesn't work
            //col.Cells[row.Index].Style.BackColor = Color.Green; //doesn't work
        dataGridView1[col.Index, row.Index].Style.BackColor = Color.Green; //doesn't work
    }
} 

tous ces trois provoquent la table d'être redessinée au-dessus de lui-même d'une manière se chevauchant et essayer de redimensionner les tables devient un gâchis. en cliquant sur une cellule, la valeur reste surlignée et la couleur ne change pas.

Q: Comment puis-je changer la couleur de fond d'un cellule individuelle après que la table existe?

20
demandé sur fifamaniac04 2013-07-18 19:40:00

4 réponses

Cela fonctionne pour moi

dataGridView1.Rows[rowIndex].Cells[columnIndex].Style.BackColor = Color.Red;
54
répondu Ehsan 2015-07-30 23:27:19

implémentez votre propre extension de DataGridViewTextBoxCell et outrepassez la méthode Paint comme ceci:

class MyDataGridViewTextBoxCell : DataGridViewTextBoxCell
{
    protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex,
        DataGridViewElementStates cellState, object value, object formattedValue, string errorText,
        DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
    {
        if (value != null)
        {
            if ((bool) value)
            {
                cellStyle.BackColor = Color.LightGreen;
            }
            else
            {
                cellStyle.BackColor = Color.OrangeRed;
            }
        }
        base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value,
            formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);
}

}

puis dans le code définir la propriété CellTemplate de votre colonne à l'instance de votre classe

columns.Add(new DataGridViewTextBoxColumn() {CellTemplate = new MyDataGridViewTextBoxCell()});
3
répondu Pavel 2016-02-22 12:05:28

Merci, ce travail

ici j'en ai fini avec ça par Qty le champ est zéro signifie qu'il montre que les cellules sont en couleur rouge

        int count = 0;

        foreach (DataGridViewRow row in ItemDg.Rows)
        {
            int qtyEntered = Convert.ToInt16(row.Cells[1].Value);
            if (qtyEntered <= 0)
            {
                ItemDg[0, count].Style.BackColor = Color.Red;//to color the row
                ItemDg[1, count].Style.BackColor = Color.Red;

                ItemDg[0, count].ReadOnly = true;//qty should not be enter for 0 inventory                       
            }
            ItemDg[0, count].Value = "0";//assign a default value to quantity enter
            count++;
        }

    }
1
répondu Rakesh 2014-06-17 08:03:54

Savoir utiliser DataBindingComplete événement pour mettre à jour le style. Le code suivant change le style de la cellule:

    private void Grid_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
    {
        this.Grid.Rows[2].Cells[1].Style.BackColor = Color.Green;
    }
0
répondu Ángel Ibáñez 2018-09-14 06:22:03