2010-02-03 8 views
106

Ich möchte die Farbe einer bestimmten Zeile in meinem Datagridview ändern. Die Zeile sollte in rot geändert werden, wenn der Wert von columcell 7 kleiner als der Wert in columcell 10 ist. Vorschläge, wie dies zu erreichen ist?Wie ändert man Zeilenfarbe in Datagridview?

Antwort

151

Sie müssen sich durch die Zeilen in der Datagridview in einer Schleife und dann vergleichen Werte der Spalten 7 und 10 in jeder Zeile.

Versuchen Sie folgendes:

foreach (DataGridViewRow row in vendorsDataGridView.Rows) 
    if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value)) 
    { 
     row.DefaultCellStyle.BackColor = Color.Red; 
    } 
+1

Vielen Dank für die Hilfe Ricardo. Ich habe den von Ihnen vorgeschlagenen Code ausprobiert. Ich kann es immer noch nicht zur Arbeit bringen. Würde es Ihnen etwas ausmachen, sich diesen Code anzusehen und mir zu sagen, wo ich falsch gelaufen bin? Ich bin ein Anfänger C# Student. Ich bin mir sicher, dass ich den Vergleichscode nicht richtig geschrieben habe. foreach (Datagridview Zeile in vendorsDataGridView.Rows) { if (row.Cells [7] .Wert ist

+0

EB Ich habe einen neuen Code hinzugefügt, der auf dem von Ihnen bereitgestellten Code basiert. Ihr sintax war ein wenig weg, versuchen Sie den Code, den ich gerade oben hinzugefügt habe. –

+2

Ricardo. Ich änderte .text zu .value und änderte zu DefaultCellstyle.Backcolor = color.red und der Code arbeitete !!! Vielen Dank für Ihre Zeit! EB –

22

Sie suchen nach der CellFormatting Veranstaltung.
Here ist ein Beispiel.

+2

Der Unterschied zu diesem Ansatz ist, dass jede einzelne Zelle verglichen mit nur einer Zelle verglichen wird. Es kann ein Leistungsproblem sein, wenn Sie mehrere hundert Zellen haben. –

12

So etwas wie folgt ... unter der Annahme, dass die Werte in den Zellen Integer sind.

foreach (DataGridViewRow dgvr in myDGV.Rows) 
{ 
    if (dgvr.Cells[7].Value < dgvr.Cells[10].Value) 
    { 
    dgvr.DefaultCellStyle.ForeColor = Color.Red; 
    } 
} 

ungetestet, so Entschuldigung für jeden Fehler.

Wenn Sie die bestimmte Zeile kennen, können Sie die Iteration überspringen:

if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value) 
{ 
    dgvr.DefaultCellStyle.ForeColor = Color.Red; 
} 
+0

Vielen Dank für Ihre Hilfe. Dein Vorschlag ist mir am nächsten, um das Problem zu lösen. Aber ich bekomme immer den Fehler, dass entweder "Wert" nicht im Kontext existiert oder "Zellen" nicht im Kontext existiert. Der Versuch, es herauszufinden ... –

+0

diese Codezeile (dgvr.Cells [7] .Value

+0

Cast sie auf Integer, dann. :-) so etwas wie: Convert.ToInt32 (dvgr.Cells [7] .Value) Demi

0

ich in der Regel die GridView.RowDataBound Event-Ereignis für diese verwenden mag zu.

protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     e.Row.ForeColor = System.Drawing.Color.Red; 
    } 
} 
+0

Er wird nach DatagridView in Window Application gefragt. Und Ihre Antwort ist über GridView of Web. – pratik1020

3
private void dtGrdVwRFIDTags_DataSourceChanged(object sender, EventArgs e) 
{ 
    dtGrdVwRFIDTags.Refresh(); 
    this.dtGrdVwRFIDTags.Columns[1].Visible = false; 

    foreach (DataGridViewRow row in this.dtGrdVwRFIDTags.Rows) 
    { 
     if (row.Cells["TagStatus"].Value != null 
      && row.Cells["TagStatus"].Value.ToString() == "Lost" 
      || row.Cells["TagStatus"].Value != null 
      && row.Cells["TagStatus"].Value.ToString() == "Damaged" 
      || row.Cells["TagStatus"].Value != null 
      && row.Cells["TagStatus"].Value.ToString() == "Discarded") 
     { 
      row.DefaultCellStyle.BackColor = Color.LightGray; 
      row.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold); 
     } 
     else 
     { 
      row.DefaultCellStyle.BackColor = Color.Ivory; 
     } 
    } 

    //for (int i= 0 ; i<dtGrdVwRFIDTags.Rows.Count - 1; i++) 
    //{ 
    // if (dtGrdVwRFIDTags.Rows[i].Cells[3].Value.ToString() == "Damaged") 
    // { 
    //  dtGrdVwRFIDTags.Rows[i].Cells["TagStatus"].Style.BackColor = Color.Red;     
    // } 
    //} 
} 
37

Ich war die Untersuchung gerade dieses Problems (damit ich weiß, diese Frage vor fast 3 Jahren veröffentlicht wurde, aber vielleicht wird es jemanden helfen ...), aber es scheint, dass eine bessere Option ist die platzieren Code innerhalb des RowPrePaint Ereignis, so dass Sie müssen nicht jede Zeile durchqueren, nur diejenigen, die gemalt bekommen (so wird es auf große Datenmenge viel besser durchführen:

auf das Ereignis anhängen

this.dataGridView1.RowPrePaint 
    += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
     this.dataGridView1_RowPrePaint); 

Der Ereigniscode

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
{ 
    if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[10].Text)) 
    { 
     dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige; 
    } 
} 
+0

Danke. Funktioniert super! – dnennis

+2

Ich mag es wirklich, wie Sie das Problem an der Wurzel fangen, anstatt zu warten, bis alles gemalt wurde. Dies ist ein sehr "outside the box" Ansatz. Die meisten Leute würden lieber nur jede Zeile wiederholen ... – bird2920

+0

Viel schneller! Vielen Dank, dass Sie darauf hingewiesen haben – ccalboni

17

ich Mühe hatte, als auch die Textfarbe zu ändern - ich sah nie die Farbe zu ändern.

Bis ich den Code hinzugefügt, um die Textfarbe zu dem Ereignis DataBindingsComplete für DataGridView zu ändern. Danach hat es funktioniert.

Ich hoffe, dass dies Menschen helfen wird, die das gleiche Problem haben.

+1

+1 Die oberen Antworten sind korrekt für WIE man die Farbe ändert, aber sie haben den Punkt verpasst wo der Code benötigt wurde. – Walter

+0

Textfarbe ändert sich nicht, wenn in onLoad (..) überschreiben oder das Ereignis. DataBindingsComplete ist viel besser Platz für die Farbeinstellung von Zeilen. – timothy

5

Einige Leute verwenden gerne die Ereignisse Paint, CellPainting oder CellFormatting, aber beachten Sie, dass das Ändern eines Stils in diesen Ereignissen rekursive Aufrufe verursacht. Wenn Sie DataBindingComplete verwenden, wird es nur einmal ausgeführt. Das Argument für CellFormatting ist, dass es nur für sichtbare Zellen aufgerufen wird, sodass Sie nicht sichtbare Zellen nicht formatieren müssen, sondern sie mehrfach formatieren.

3

Sie können Backcolor Zeile für Zeile ändern, indem Sie Ihre Bedingung verwenden.und diesen Funktionsaufruf nach der Anwendung Datasource von DatagridView.

Hier ist die Funktion dafür. Kopieren Sie einfach die und legt es nach Databind

private void ChangeRowColor() 
{ 
    for (int i = 0; i < gvItem.Rows.Count; i++) 
    { 
     if (BindList[i].MainID == 0 && !BindList[i].SchemeID.HasValue) 
      gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#C9CADD"); 
     else if (BindList[i].MainID > 0 && !BindList[i].SchemeID.HasValue) 
      gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#DDC9C9"); 
     else if (BindList[i].MainID > 0) 
      gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#D5E8D7"); 
     else 
      gvItem.Rows[i].DefaultCellStyle.BackColor = Color.White; 
    } 
} 
0

Arbeiten auf Visual Studio 2010 (ich es ausprobiert und es funktioniert!) Es wird Ihre ganze Reihe malen.

  1. Erstellen Sie eine Schaltfläche für die datagridview.
  2. Erstellen Sie ein CellClick Ereignis und legen Sie die nächste Codezeile hinein.

if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)  
{ 
    dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige; 
} 
0

Sie nicht Wert erwähnt haben, wie geändert wird. Ich habe ähnliche Funktionen verwendet, wenn Benutzer Werte eingeben. d. h. Eingabe und Verlassen des Bearbeitungsmodus.

Verwendung CellEndEdit Ereignis von Datagridview.

private void dgMapTable_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    double newInteger; 

    if (double.TryParse(dgMapTable[e.ColumnIndex,e.RowIndex].Value.ToString(), out newInteger) 
    { 
     if (newInteger < 0 || newInteger > 50) 
     { 
      dgMapTable[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red; 

      dgMapTable[e.ColumnIndex, e.RowIndex].ErrorText 
       = "Keep value in Range:" + "0 to " + "50"; 
     } 
    }        
} 

Sie können die Logik zum Löschen der Fehlerbenachrichtigung auf ähnliche Weise hinzufügen. Wenn in Ihrem Fall Daten programmgesteuert geladen werden, kann CellLeave Ereignis mit demselben Code verwendet werden.

1

Dies ist meine Lösung Farbe mit Datagridview bindingDataSource zu ändern:

private void dataGridViewECO_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{    

    if (e.ListChangedType != ListChangedType.ItemDeleted) 
    { 

     DataGridViewCellStyle green = this.dataGridViewECO.DefaultCellStyle.Clone(); 
     green.BackColor = Color.Green; 

     DataGridViewCellStyle gray = this.dataGridViewECO.DefaultCellStyle.Clone(); 
     gray.BackColor = Color.LightGray; 



     foreach (DataGridViewRow r in this.dataGridViewECO.Rows) 
     { 

      if (r.Cells[8].Value != null) 
      { 

       String stato = r.Cells[8].Value.ToString(); 


       if (!" Open ".Equals(stato)) 
       { 
        r.DefaultCellStyle = gray; 
       } 
       else 
       { 
        r.DefaultCellStyle = green; 
       } 
      } 

     } 

    } 
} 
0

Mit diesem Code können Sie nur die Zeilen ändern Hintergrundfarbe, wo columname Wert null anderen Zeilen Farbe immer noch der Standard ein.

 foreach (DataGridViewRow row in dataGridView1.Rows) 
       { 
        if (row.Cells["columnname"].Value != null) 
        { 
         dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose; 
        } 
       } 
0

Nur eine Notiz über DefaultCellStyle.BackColor Einstellung ... Sie es keinen transparenten Wert außer Color.Empty nicht einstellen. Das ist der Standardwert. Das impliziert (jedenfalls für mich), dass transparente Farben in Ordnung sind. Sie sind nicht. Jede Zeile, die ich auf eine transparente Farbe setze, zeichnet nur die Farbe ausgewählter Zeilen.

Ich verbrachte zu viel Zeit damit, meinen Kopf gegen die Wand zu schlagen.

1

Wenn Sie an eine (Sammlung) von konkreten Objekten binden, können Sie das konkrete Objekt über die DataBoundItem-Eigenschaft der Zeile abrufen. (Um zu überprüfen, für magische Zeichenfolge in der Zelle zu vermeiden und "echte" Eigenschaften des Objekts verwendet wird)

Skeleton Beispiel unten:

DTO/POCO

public class Employee 
{ 
    public int EmployeeKey {get;set;} 

    public string LastName {get;set;} 

    public string FirstName {get;set;} 

    public bool IsActive {get;set;} 
}  

Bindung an die Datagridview

private void BindData(ICollection<Employee> emps) 
    { 
     System.ComponentModel.BindingList<Employee> bindList = new System.ComponentModel.BindingList<Employee>(emps.OrderBy(emp => emp.LastName).ThenBy(emp => emp.FirstName).ToList()); 
     this.dgvMyDataGridView.DataSource = bindList; 
    }  

dann der Event-Handler und das konkrete Objekt (anstelle eines DataGridRow und/oder Zellen)

 private void dgvMyDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
     { 
      Employee concreteSelectedRowItem = this.dgvMyDataGridView.Rows[e.RowIndex].DataBoundItem as Employee; 
      if (null != concreteSelectedRowItem && !concreteSelectedRowItem.IsActive) 
      { 
       dgvMyDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray; 
      } 
     } 
0

int counter = gridEstimateSales.Rows.Anzahl;

 for (int i = 0; i < counter; i++) 
     { 
      if (i == counter-1) 
      { 
       //this is where your LAST LINE code goes 
       //row.DefaultCellStyle.BackColor = Color.Yellow; 
       gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.Red; 
      } 
      else 
      { 
       //this is your normal code NOT LAST LINE 
       //row.DefaultCellStyle.BackColor = Color.Red; 
       gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.White; 
      } 
     } 
Verwandte Themen