2013-10-15 8 views
22

Ich habe die Daten aus der Datenbank zu Datagridview geladen und haben zwei Spalten Zielwert und Volumen, in dem Volumen> Zielwert, das Volumen Zelle in der grünen Farbe und Volumen < Zielwert sein sollte, dann sollte Volumen sein in rote Farbe. Ich habe es versucht, aber ich kann es nicht tun.Ändern Datagridview Zellenfarbe auf Basis der Bedingung

private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    if (dataGridView1.Rows.Count > 0 && dataGridView1.Columns.Count > 0) 
    { 
     foreach (DataGridViewRow r in dataGridView1.Rows) 
     { 
      if (Volume > target value) 
      { 
       cell.Style.BackColor = Color.AliceBlue; 
      } 

Antwort

13

Sie benötigen diese

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    foreach (DataGridViewRow Myrow in dataGridView1.Rows) 
    {   //Here 2 cell is target value and 1 cell is Volume 
     if (Convert.ToInt32(Myrow .Cells[2].Value)<Convert.ToInt32(Myrow .Cells[1].Value))// Or your condition 
     { 
      Myrow .DefaultCellStyle.BackColor = Color.Red; 
     } 
     else 
     { 
      Myrow .DefaultCellStyle.BackColor = Color.Green; 
     } 
    } 
} 

Zwischenzeit tun nehmen auch einen Blick auf Cell Formatting

+0

Dank, Sorry für die späte Antwort funktionierte es perfekt .. – preethi

+13

Wäre das nicht unglaublich ineffizient sein? Da Sie alle Datensätze jedes Mal durchlaufen, werden alle Zellen neu gezeichnet. Wenn Sie diesen Ansatz verwenden, muss die gesamte Foreach-Klausel nicht innerhalb des CellFormatting-Handlers sein, sondern "dataGridView1_DataBindingComplete". – 40Plot

+4

oder verwenden Sie var Myrow = dataGridView1.Rows [e.RowIndex] anstelle einer Schleife –

17

I NICHT Schleifen über jeweils Zeilen jedes Mal, CellFormating heißt vorschlagen, weil er so genannt wird, Jedes Mal muss eine einzelne Reihe erneuert werden.

Private Sub dgv_DisplayData_Vertical_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgv_DisplayData_Vertical.CellFormatting 
     Try 

      If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "6" Then 

       e.CellStyle.BackColor = Color.DimGray 
      End If 
      If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "5" Then 
       e.CellStyle.BackColor = Color.DarkSlateGray 
      End If 
      If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "4" Then 
       e.CellStyle.BackColor = Color.SlateGray 
      End If 
      If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "3" Then 
       e.CellStyle.BackColor = Color.LightGray 
      End If 
      If dgv_DisplayData_Vertical.Rows(e.RowIndex).Cells("LevelID").Value.ToString() = "0" Then 
       e.CellStyle.BackColor = Color.White 
      End If 

     Catch ex As Exception 

     End Try 

    End Sub 
+0

Später Kommentar hier: Dieser Code wäre besser Dim-Wert als String = gv_DisplayData_Vertical.Rows (e.RowIndex) .Cells ("LevelID"). Wert. ToString() Wählen Sie Value case "1" e.CellStyle.BackColor = Color.DimGray Exit Wählen Sie EndSelect code wäre kürzer, einfacher zu lesen und auch case ist schneller nach der dritten if-Anweisung. – Ken

+0

Es ändert sich die Farbe jeder Zelle –

14

Kyles und Simons Antworten sind eine Verschwendung von CPU-Ressourcen. CellFormatting und CellPainting Ereignisse treten viel zu oft auf und sollten nicht zum Anwenden von Stilen verwendet werden. Hier sind zwei bessere Möglichkeiten, es zu tun:

Wenn Ihre DataGridView oder mindestens die Spalten, die Zellenstil entscheiden, schreibgeschützt sind, sollten Sie DefaultCellStyle der Zeilen in RowsAdded Ereignis ändern. Dieses Ereignis tritt nur einmal auf, wenn eine neue Zeile hinzugefügt wird. Die Bedingung sollte zu diesem Zeitpunkt ausgewertet werden und DefaultCellStyle der Zeile sollte darin festgelegt werden. Beachten Sie, dass dieses Ereignis auch für DataBound-Situationen auftritt.

Wenn Ihr DataGridView oder diese Spalten Bearbeitung erlauben, sollten Sie CellEndEdit oder CommitEdit Ereignisse verwenden, um DefaultCellStyle zu ändern.

+0

@dotNET Ich weiß, Post ist alt - und ein sehr guter Punkt. Was ist, wenn Sie nur die einzelne Zelle ändern möchten, die sich geändert hat, und nicht die ganze Zeile? Und angenommen, nur die Bindungsquelle wird geändert und die Zelleditierereignisse wurden nicht aufgerufen? – Ken

+0

@Ken: Sie können immer noch 'RowsAdded' Ereignis verwenden. Anstatt "DefaultCellStyle" der Zeile zu verwenden, sollten Sie in diesem Fall die Eigenschaft "Style" der gewünschten Zelle verwenden. Wenn Sie den Stil basierend auf Änderungen der Datenquelle ändern müssen, sollten Sie die Ereignisse abhören, die von der Datenquelle selbst ausgelöst werden, und den darin enthaltenen Stil ändern. Wenn Sie beispielsweise eine 'DataTable' als Datenquelle verwenden, können Sie' RowChanged' oder 'ColumnChanged' Ereignisse der' DataTable' abhören. – dotNET

+0

Ja das ist richtig und funktioniert –

1
foreach (DataGridViewRow row in dgvWebData.Rows) 
      { 


       if (Convert.ToString(row.Cells["IssuerName"].Value) != Convert.ToString(row.Cells["SearchTermUsed"].Value)) 
       { 
        row.DefaultCellStyle.BackColor = Color.Yellow; 

       } 
       else 
       { 
        row.DefaultCellStyle.BackColor = Color.White; 
       } 

      } 

Das ist für mich perfekt funktioniert. Selbst wenn eine Zeile geändert wird, ist das gleiche Ereignis wichtig.

-1
//After Done Binding DataGridView Data 
foreach(DataGridViewRow DGVR in DGV_DETAILED_DEF.Rows) 
{ 
    if(DGVR.Index != -1) 
    { 
     if(DGVR.Cells[0].Value.ToString() == "البدلات") 
     { 
      CurrRType = "البدلات"; 
      DataGridViewCellStyle CS = DGVR.DefaultCellStyle; 
      CS.BackColor = Color.FromArgb(0,175,100); 
      CS.ForeColor = Color.FromArgb(0,32,15); 

      CS.Font = new Font("Times New Roman",12,FontStyle.Bold); 
      CS.SelectionBackColor = Color.FromArgb(0,175,100); 
      CS.SelectionForeColor = Color.FromArgb(0,32,15); 
      DataGridViewCellStyle LCS = DGVR.Cells[DGVR.Cells.Count - 1].Style; 
      LCS.BackColor = Color.FromArgb(50,50,50); 
      LCS.SelectionBackColor = Color.FromArgb(50,50,50); 
     } 
     else if(DGVR.Cells[0].Value.ToString() == "الإستقطاعات") 
     { 
      CurrRType = "الإستقطاعات"; 
      DataGridViewCellStyle CS = DGVR.DefaultCellStyle; 
      CS.BackColor = Color.FromArgb(175,0,50); 
      CS.ForeColor = Color.FromArgb(32,0,0); 
      CS.Font = new Font("Times New Roman",12,FontStyle.Bold); 
      CS.SelectionBackColor = Color.FromArgb(175,0,50); 
      CS.SelectionForeColor = Color.FromArgb(32,0,0); 
      DataGridViewCellStyle LCS = DGVR.Cells[DGVR.Cells.Count - 1].Style; 
      LCS.BackColor = Color.FromArgb(50,50,50); 
      LCS.SelectionBackColor = Color.FromArgb(50,50,50); 
     } 
    } 
} 
-1

machen es einfach

private void dataGridView1_cellformatting(object sender,DataGridViewCellFormattingEventArgs e) 
{ 
    var volume = (int)e.Value; 
    var target = (int)e.Value; 

    // return if rowCount = 0 
    if (this.dataGridView1.Rows.Count == 0) 
     return; 

    if (volume > target) 
     e.CellStyle.BackColor = Color.Green; 
    else 
     e.CellStyle.BackColor = Color.Red; 

} 

einen Blick cell formatting

1

Angenommen, Sie haben bestimmte Zelle zu färben (nicht alle Zellen der Zeile) durch das Wissen, zwei Dinge:

  1. Name oder Index der Spalte.
  2. Wert, der in der Zelle sein wird.

In THAS Fall, dass Sie Ereignis CellFormatting

In meinem Fall habe ich wie dieses

private void DgvTrucksMaster_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    foreach (DataGridViewRow row in dgvTrucksMaster.Rows) 
    { 
     if (Convert.ToInt32(row.Cells["Decade1Hours"].Value) > 0) 
     { 
      row.Cells["Decade1Hours"].Style.BackColor = Color.LightGreen; 
     } 
     else if (Convert.ToInt32(row.Cells["Decade1Hours"].Value) < 0) 
     { 
      // row.DefaultCellStyle.BackColor = Color.LightSalmon; // Use it in order to colorize all cells of the row 

      row.Cells["Decade1Hours"].Style.BackColor = Color.LightSalmon; 
     } 
    } 
} 

verwenden verwenden und führen Sie hier sehen

enter image description here

Also hier Sie können auf bestimmte Zellen der Zeile in der Spalte mit dem NamenzugreifenReihe.Zellen ["Decade1Hours"]

Woher kennen Sie diesen Namen? Nun, in meinem Fall erstelle ich eine Spalte von DataGridView wie folgt.

var Decade1Hours = new DataGridViewTextBoxColumn() 
{ 
    Name = "Decade1Hours", 
    Width = 50, 
    DataPropertyName = "Decade1Hours", 
    ReadOnly = true, 
    DefaultCellStyle = new DataGridViewCellStyle() 
     { 
     Alignment = DataGridViewContentAlignment.MiddleCenter, 
     ForeColor = System.Drawing.Color.Black, 
     Font = new Font(font, FontStyle.Bold), 
     Format = "n2" 
     }, 
    HeaderCell = new DataGridViewColumnHeaderCell() 
     { 
      Style = new DataGridViewCellStyle() 
       { 
       Alignment = DataGridViewContentAlignment.MiddleCenter, 
       BackColor = System.Drawing.Color.Blue 
       } 
     } 
}; 
Decade1Hours.HeaderText = "Дек.1"; 
dgvTrucksMaster.Columns.Add(Decade1Hours); 

Und gut ... Sie müssen Sie zum Beispiel kolorieren einige der Zellen in der Zeile wie ## 1 4 5 und 8 Sie Zelle Index verwenden (es beginnt bei 0).

Und Code wird lok wie

private void DgvTrucksMaster_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    foreach (DataGridViewRow row in dgvTrucksMaster.Rows) 
    { 
    if (Convert.ToInt32(row.Cells[1].Value) > 0) 
    { 
     row.Cells[1].Style.BackColor = Color.LightGreen; 
    } 
    } 
} 
Verwandte Themen