web-dev-qa-db-de.com

Ändern der Farbe der Datagridview-Zellen basierend auf den Bedingungen

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

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

18
Rohit

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
18
Simon

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.

17
dotNET
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.

3
Sumit Agrawal

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

Nehmen wir an, Sie müssen bestimmte Zellen (nicht alle Zellen der Reihe) farbig markieren, indem Sie zwei Dinge wissen:

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

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 

 enter image description here

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;
        }
    }
}
1
AJEET YA

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
0
Scope Creep

Ü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;
        }
    }
0
clamchoda