Changing datagridview cell color based on condition

前端 未结 12 976
粉色の甜心
粉色の甜心 2020-12-02 20:36

I have loaded the data from database to datagridview and have two columns target value and volume where volume >target value that volume cell should be in green color and

相关标签:
12条回答
  • 2020-12-02 20:54

    You need to do this

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

    Meanwhile also take a look at Cell Formatting

    0 讨论(0)
  • 2020-12-02 20:55

    Without looping it can be achived like below.

    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);
            }
        }
    
    0 讨论(0)
  • 2020-12-02 20:55

    I know this is an old post, but I found my way here in 2018, so maybe someone else will too. In my opinion, the OP had a better approach (using dgv_DataBindingComplete event) than any of the answers provided. At the time of writing, all of the answers are written using paint events or cellformatting events which seems inefficient.

    The OP was 99% of the way there, all they had to do was loop through their rows, test the cell value of each row, and set the BackColor, ForeColor, or whatever other property you want to set.

    Please excuse the vb.NET syntax, but I think its close enough to C# that it should be clear.

    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 讨论(0)
  • 2020-12-02 20:56

    I may suggest NOT looping over each rows EACH time CellFormating is called, because it is called everytime A SINGLE ROW need to be refreshed.

    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 讨论(0)
  • 2020-12-02 20:57

    make it simple

    private void dataGridView1_cellformatting(object sender,DataGridViewCellFormattingEventArgs e)
    {
         var amount = (int)e.Value;
    
         // return if rowCount = 0
         if (this.dataGridView1.Rows.Count == 0)
             return;
    
         if (amount > 0)
             e.CellStyle.BackColor = Color.Green; 
         else
             e.CellStyle.BackColor = Color.Red;
    
    }
    

    take a look cell formatting

    0 讨论(0)
  • 2020-12-02 20:58
    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;
        }
    }
    

    This Perfectly worked for me . even if a row is changed, same event takes care.

    0 讨论(0)
提交回复
热议问题