Ich habe die Daten von der Datenbank in datagridview geladen und habe zwei Spalten mit Zielwert und Volumen, wobei Volumen> Zielwert, dessen Volumenzelle in grüner Farbe sein soll, und Volumen <Zielwert und Volumen dann in roter Farbe sein soll. Ich habe es ausprobiert, kann es aber nicht.
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;
}
Du musst das tun
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;
}
}
}
Schauen Sie sich auch unter Cell Formatting
Ich kann vorschlagen, dassNICHTüber jede Zeile wiederholt wird. Jedes Mal, wenn CellFormating aufgerufen wird, weil es jedes Mal aufgerufen wird, wenn eine einzelne Zeile aktualisiert werden muss.
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
Die Antworten von Kyle und Simon sind grobe 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, dies zu tun:
Wenn Ihr DataGridView oder zumindest die Spalten, die den Zellenstil bestimmen, schreibgeschützt sind, sollten Sie den 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 gesetzt werden. Beachten Sie, dass dieses Ereignis auch für DataBound-Situationen auftritt.
Wenn Ihr DataGridView oder diese Spalten die Bearbeitung zulassen, sollten Sie CellEndEdit
oder CommitEdit
-Ereignisse verwenden, um DefaultCellStyle
zu ändern.
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 hat perfekt für mich gearbeitet. selbst wenn eine Zeile geändert wird, kümmert sich dasselbe Ereignis.
Ohne Schleifen kann wie unten beschrieben erreicht werden.
private void dgEvents_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
FormatRow(dgEvents.Rows[e.RowIndex]);
}
private void FormatRow(DataGridViewRow myrow)
{
try
{
if (Convert.ToString(myrow.Cells["LevelDisplayName"].Value) == "Error")
{
myrow.DefaultCellStyle.BackColor = Color.Red;
}
else if (Convert.ToString(myrow.Cells["LevelDisplayName"].Value) == "Warning")
{
myrow.DefaultCellStyle.BackColor = Color.Yellow;
}
else if (Convert.ToString(myrow.Cells["LevelDisplayName"].Value) == "Information")
{
myrow.DefaultCellStyle.BackColor = Color.LightGreen;
}
}
catch (Exception exception)
{
onLogs?.Invoke(exception.Message, EventArgs.Empty);
}
}
Nehmen wir an, Sie müssen bestimmte Zellen (nicht alle Zellen der Reihe) farbig markieren, indem Sie zwei Dinge wissen:
In diesem Fall müssen Sie event CellFormatting verwenden.
In meinem Fall verwende ich so
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;
}
}
}
Und das Ergebnis können Sie hier sehen
Daher können Sie hier auf bestimmte Zellen der Zeile in der Spalte über ihren Namen zugreifen Row.Cells ["Decade1Hours"]
Woher kennen Sie diesen Namen? In meinem Fall erstelle ich eine Spalte von DataGridView so.
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 zum Beispiel einige der Zellen in der Zeile einfärben, wie zum Beispiel ## 1 4 5 und 8, und Sie müssen den Zellindex verwenden (er beginnt bei 0).
Und Code wird lok mögen
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;
}
}
}
private void dataGridView1_DataBindingComplete(object sender DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToInt32(row.Cells["balaceAmount"].Value) == 0)
{
row.DefaultCellStyle.BackColor = Color.Yellow;
}
else
{
row.DefaultCellStyle.BackColor = Color.White;
}
}
}
Ich weiß, dass dies ein alter Beitrag ist, aber ich habe 2018 hierher gefunden, also vielleicht auch jemand anderes. Meines Erachtens hatte das OP (mit dem Ereignis dgv_DataBindingComplete) einen besseren Ansatz als alle Antworten. Zum Zeitpunkt des Schreibens werden alle Antworten mit Paint-Ereignissen oder mit Cellformatting-Ereignissen geschrieben, was ineffizient erscheint.
Das OP war zu 99% auf dem Weg dorthin, alles was sie tun mussten, war durch die Zeilen zu scrollen, den Zellenwert jeder Zeile zu testen und BackColor, ForeColor oder was auch immer andere Eigenschaften einzustellen.
Bitte entschuldigen Sie die vb.NET-Syntax, aber ich denke, es ist nahe genug an C #, damit es klar sein sollte.
Private Sub dgvFinancialResults_DataBindingComplete Handles dgvFinancialResults.DataBindingComplete
Try
Logging.TraceIt()
For Each row As DataGridViewRow in dgvFinancialResults.Rows
Dim invoicePricePercentChange = CSng(row.Cells("Invoice Price % Change").Value)
Dim netPricePercentChange = CSng(row.Cells("Net Price % Change").Value)
Dim tradespendPricePercentChange = CSng(row.Cells("Trade Spend % Change").Value)
Dim dnnsiPercentChange = CSng(row.Cells("DNNSI % Change").Value)
Dim cogsPercentChange = CSng(row.Cells("COGS % Change").Value)
Dim grossProfitPercentChange = CSng(row.Cells("Gross Profit % Change").Value)
If invoicePricePercentChange > Single.Epsilon Then
row.Cells("Invoice Price % Change").Style.ForeColor = Color.Green
Else
row.Cells("Invoice Price % Change").Style.ForeColor = Color.Red
End If
If netPricePercentChange > Single.Epsilon Then
row.Cells("Net Price % Change").Style.ForeColor = Color.Green
Else
row.Cells("Net Price % Change").Style.ForeColor = Color.Red
End If
If tradespendPricePercentChange > Single.Epsilon Then
row.Cells("Trade Spend % Change").Style.ForeColor = Color.Green
Else
row.Cells("Trade Spend % Change").Style.ForeColor = Color.Red
End If
If dnnsiPercentChange > Single.Epsilon Then
row.Cells("DNNSI % Change").Style.ForeColor = Color.Green
Else
row.Cells("DNNSI % Change").Style.ForeColor = Color.Red
End If
If cogsPercentChange > Single.Epsilon Then
row.Cells("COGS % Change").Style.ForeColor = Color.Green
Else
row.Cells("COGS % Change").Style.ForeColor = Color.Red
End If
If grossProfitPercentChange > Single.Epsilon Then
row.Cells("Gross Profit % Change").Style.ForeColor = Color.Green
Else
row.Cells("Gross Profit % Change").Style.ForeColor = Color.Red
End If
Next
Catch ex As Exception
Logging.ErrorHandler(ex)
End Try
End Sub
Überrascht niemandem, dass eine einfache if
-Anweisung sicherstellen kann, dass Ihre Schleife nur einmal pro Format (in der ersten Spalte der ersten Zeile) ausgeführt wird.
private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
// once per format
if (e.ColumnIndex == 0 && e.RowIndex == 0)
{
foreach (DataGridViewRow row in dgv.Rows)
if (row != null)
row.DefaultCellStyle.BackColor = Color.Red;
}
}