C# Itération Sur Le DataGridView Et Le Changement De Couleur Des Lignes

j'ai un datagridview composé de plusieurs lignes et colonnes. Je veux itérer sur chaque ligne et de vérifier le contenu d'une colonne spécifique. Si cette colonne contient le mot "Non", Je veux changer le forecolor de la ligne entière en Rouge. Voici une tentative à un certain code jusqu'à présent, mais il est certainement ne fonctionne pas, en commençant à se demander si je dois itérer au-dessus de chaque cellule?

CODE:

foreach (DataGridViewRow dgvr in dataGridView1.Rows)
        {
            if (dgvr.Cells["FollowedUp"].Value.ToString() == ("No"))
            {
                dgvr.DefaultCellStyle.ForeColor = Color.Red;
            }
        }
22
demandé sur cjk 2009-07-03 14:33:23

7 réponses

crochet OnRowDataBound événement puis faire des trucs

ASPX (Grid):

    <asp:.... OnRowDataBound="RowDataBound"..../>

Code Behind:

    protected void RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowIndex == -1)
        {
            return;
        }

        if(e.Row.Cells[YOUR_COLUMN_INDEX].Text=="NO"){
             e.Row.BackColor=Color.Red;   
        }
    }

pour WinForms:

hook the **DataBindingComplete** event and do stuff in it:

     private void dataGridView1_DataBindingComplete(object sender, 
                       DataGridViewBindingCompleteEventArgs e)
    {
        if (e.ListChangedType != ListChangedType.ItemDeleted)
        {
            DataGridViewCellStyle red = dataGridView1.DefaultCellStyle.Clone();
            red.BackColor=Color.Red;

            foreach (DataGridViewRow r in dataGridView1.Rows)
            {
                if (r.Cells["FollowedUp"].Value.ToString()
                       .ToUpper().Contains("NO"))
                {
                    r.DefaultCellStyle = red;
                }
            }
        }
    }
25
répondu TheVillageIdiot 2009-07-03 11:00:24

sur votre DataGridView, gérez L'événement CellFormatting:

dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting);

Votre gestionnaire d'événement pourrait alors ressembler à ceci:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{       
    if(dataGridView1.Columns[e.ColumnIndex].Name == "FollowedUp" && e.Value != null && e.Value.ToString() == "No")
        dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = Color.Red;  
}

de cette façon, vous n'êtes pas en train de "itérer" au-dessus des lignes -- en changeant simplement la couleur avec laquelle elles sont peintes/dessinées quand elles deviennent visibles (et nécessitent donc un formatage) dans la grille.

9
répondu Rostov 2010-12-08 20:56:01
public void ColourChange()
    {
        DataGridViewCellStyle RedCellStyle = null;
        RedCellStyle = new DataGridViewCellStyle();
        RedCellStyle.ForeColor = Color.Red;
        DataGridViewCellStyle GreenCellStyle = null;
        GreenCellStyle = new DataGridViewCellStyle();
        GreenCellStyle.ForeColor = Color.Green;


        foreach (DataGridViewRow dgvr in dataGridView1.Rows)
        {
            if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No"))
            {
                dgvr.DefaultCellStyle = RedCellStyle;
            }
            if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("Yes"))
            {
                dgvr.DefaultCellStyle = GreenCellStyle;
            }
        }
    }
5
répondu Goober 2009-07-03 11:06:22

est-il possible qu'il y ait des espaces ou un autre caractère faisant partie de la valeur de la cellule? Si c'est le cas, essayez D'utiliser la méthode Contains plutôt que l'égalité pure.

if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No"))
2
répondu William Edmondson 2009-07-03 10:44:35

C'est la solution pour Winforms:

private void HighlightRows()
{
    DataGridViewCellStyle GreenStyle = null;

    if (this.dgridv.DataSource != null)
    {
        RedCellStyle = new DataGridViewCellStyle();
        RedCellStyle.BackColor = Color.Red;

        for (Int32 i = 0; i < this.dgridv.Rows.Count; i++)
        {
            if (((DataTable)this.dgridv.DataSource).Rows[i]["col_name"].ToString().ToUpper() == "NO")
            {
                this.dgridv.Rows[i].DefaultCellStyle = RedCellStyle;
                continue;
            }
        }
    }
}
0
répondu Rashmi Pandit 2009-07-03 10:49:57

Ce code fonctionne très bien pour moi:


foreach (DataGridViewRow row in dataGridView1.Rows)
{
    if ((string)row.Cells["property_name"].Value == UNKNOWN_PROPERTY_NAME)
    {
        row.DefaultCellStyle.BackColor = Color.LightSalmon;
        row.DefaultCellStyle.SelectionBackColor = Color.Salmon;
    }
}

mis à part le casting sous forme de chaîne de caractères plutôt que d'appeler ToString, Je ne vois pas vraiment de différence, donc ça pourrait être un bug sensible à la casse. Essayez d'utiliser:

dgvr.Cells["FollowedUp"].Value.ToString().ToUpper() == "NO"
0
répondu 2009-07-03 10:54:01
private void Grd_Cust_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    colorCode == 4 ? Color.Yellow : Color.Brown;
    if (e.RowIndex < 0 || Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value == DBNull.Value)
        return;
    string colorCode = Grd_Cust.Rows[e.RowIndex].Cells["FollowedUp"].Value.ToString();
    e.CellStyle.BackColor = colorCode == "NO" ? Color.Red : Grd_Cust.DefaultCellStyle.BackColor;
}
0
répondu Mustafa Salman 2012-06-18 07:59:23