2009-07-03 16 views
22

Ho una vista dati composta da più righe e colonne. Voglio scorrere tutte le righe e controllare il contenuto di una colonna specifica. Se la colonna contiene la parola "NO", voglio cambiare il colore predefinito dell'intera riga in Rosso. Ecco un tentativo fino ad ora di codice ma sicuramente non funziona, cominciando a chiedermi se ho bisogno di iterare su ogni cellula?C# Iterate Over DataGridView & Change Row Color

CODICE:

foreach (DataGridViewRow dgvr in dataGridView1.Rows) 
     { 
      if (dgvr.Cells["FollowedUp"].Value.ToString() == ("No")) 
      { 
       dgvr.DefaultCellStyle.ForeColor = Color.Red; 
      } 
     } 
+1

Che cosa significa "non funziona"? Nessuna riga? la cella non può essere trovata? – Colin

risposta

5
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; 
      } 
     } 
    } 
+10

Non guadagni nulla facendo [Type x = null; x = new Type();]. Dovresti unire queste due linee in [Tipo x = nuovo Tipo();] –

25

hook up OnRowDataBound evento poi fare cose

ASPX (griglia):

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

Codice Dietro:

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

PER 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; 
       } 
      } 
     } 
    } 
+3

Spiacente, questa è solo una semplice app WinForms ......... – Goober

+1

oops! è tutto così web e sono io stesso nel progetto web da 3 mesi che sembra normale che ogni domanda riguardi l'asp.net – TheVillageIdiot

+0

qualcuno che ha votato e non sa perché? – TheVillageIdiot

2

E 'possibile ci sono spazi o altri caratteri come parte del valore della cella? In tal caso, provare a utilizzare il metodo Contiene anziché l'uguaglianza diretta.

if (dgvr.Cells["FollowedUp"].Value.ToString().Contains("No")) 
0

Questa è la soluzione per 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

Nessuna eccezione e Nessun colore modificato. Non so perché, per favore, ho bisogno di aiuto –

0

Questo codice funziona bene per me:

 

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

Oltre a lanciare come una stringa piuttosto che chiamare ToString io veramente non vedere alcun differenza quindi potrebbe essere un errore di maiuscole e minuscole. Provare a utilizzare:

 
dgvr.Cells["FollowedUp"].Value.ToString().ToUpper() == "NO" 
9

Sul DataGridView, gestire l'evento CellFormatting:

dataGridView1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting); 

vostro gestore di eventi potrebbe quindi simile a questa:

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

In questo modo si aren 't' iterando 'sulle righe - semplicemente cambiando il colore con cui sono disegnate/disegnate quando diventano visibili (e quindi la formattazione dei quo) nella griglia.

+0

Questo metodo è un LOTTO più lento, ma la formattazione non viene cancellata da un intestazione di colonna. –

+0

Spiacente, c'era qualcosa di sbagliato nella mia sostituzione del codice gestore evento e non posso modificare il mio commento precedente. Sostituirei "un MOLTO" con "un po 'più lento". –

+0

A seconda di ciò che si sta facendo nel gestore, verrà eseguita la maggior parte di questa (prestazione) determinazione. In definitiva, però, l'utilizzo del metodo handler significa che (come dici tu) non verrà cancellato dall'ordinamento delle colonne. Ma anche nel caso di una griglia con migliaia di righe non si "formattano" le righe che l'utente potrebbe non vedere mai comunque. – Rostov

0
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; 
} 
+1

Benvenuti in StackOverflow. Suggerimento, puoi usare il pulsante '{}' per formattare i frammenti di codice. – Leigh