Vb.net Datagridview没有';更改组合框值时不要更改颜色

Vb.net Datagridview没有';更改组合框值时不要更改颜色,vb.net,datagridview,colors,Vb.net,Datagridview,Colors,我对datagrid有以下问题 我有一个datagridview,其中有几个已经着色的列和一个组合框。datagridview的第一列“信号名”与组合框的值相同 我的目标是使用与组合框中相同的信号名称更改行的颜色,并使用相同的初始颜色保留其他行 我尝试了下面的代码,但在运行时它不会“重置”初始颜色。相反,所需行的颜色已正确更改,但是,当我使用组合框将值更改为另一个值时,它不会像应该的那样重置为通常的颜色,并且我最终得到两行颜色 Public Sub ComboBox1_Selka() H

我对datagrid有以下问题

我有一个datagridview,其中有几个已经着色的列和一个组合框。datagridview的第一列“信号名”与组合框的值相同

我的目标是使用与组合框中相同的信号名称更改行的颜色,并使用相同的初始颜色保留其他行

我尝试了下面的代码,但在运行时它不会“重置”初始颜色。相反,所需行的颜色已正确更改,但是,当我使用组合框将值更改为另一个值时,它不会像应该的那样重置为通常的颜色,并且我最终得到两行颜色

    Public Sub ComboBox1_Selka() Handles ComboBox1.SelectedValueChanged

    dgv_Sigdata.Columns("Target Profit").DefaultCellStyle.BackColor = Color.FromArgb(102, 255, 102)
    dgv_Sigdata.Columns("Avg Loss").DefaultCellStyle.BackColor = Color.FromArgb(247, 197, 141)
    dgv_Sigdata.Columns("Avg Win").DefaultCellStyle.BackColor = Color.FromArgb(102, 255, 102)
    dgv_Sigdata.Columns("Stop Loss").DefaultCellStyle.BackColor = Color.FromArgb(247, 197, 141)
    dgv_Sigdata.Columns("Target Profit").DefaultCellStyle.BackColor = Color.Beige

    For Each row As DataGridViewRow In dgv_Sigdata.Rows
        If row.Cells.Item(0).Value.ToString = ComboBox1.Text Then


            dgv_Sigdata.Rows(row.Index).Cells("Signal Name").Style.BackColor = Color.FromArgb(10, 2, 102)
            dgv_Sigdata.Rows(row.Index).DefaultCellStyle.BackColor = Color.FromArgb(10, 2, 102)
        Else
            dgv_Sigdata.Rows(row.Index).Cells("Signal Name").Style.BackColor = Color.White
        End If
    Next row

  End Sub
假设此代码将所有列重置为其初始颜色,然后仅为组合框行着色。然而,事实并非如此


谢谢你的帮助

首先,按照您的建议进行操作

接下来,请注意颜色更改的逻辑:

  • 可以为每列设置默认颜色。这很有效
  • 如果行的第一个单元格值与组合框选择匹配:
  • 颜色
    单元格(“信号名称”)
    深蓝色。(冗余到下一行)
  • 将该行的默认颜色设置为深蓝色。(覆盖列颜色)
  • 其他:
  • 颜色
    单元格(“信号名称”)
    白色。这很有效
  • 一旦设置了行的
    DefaultCellStyle.BackColor
    ,它将优先于列默认值。您可以将其更改回白色,但仍会覆盖列颜色。层次结构似乎如下所示:

    Cell.Style.BackColor -overrides-> Row.DefaulCellStyle.BackColor -overrides-> Column.DefaultCellStyle.BackColor
    
    解决方案:

    Public Sub ComboBox1_Selka() Handles ComboBox1.SelectedValueChanged
    
        For Each row As DataGridViewRow In dgv_Sigdata.Rows
            If row.Cells.Item(0).Value.ToString = ComboBox1.SelectedItem.ToString Then
                For Each cell as DataGridViewCell In row
                    cell.Style.BackColor = Color.FromArgb(10, 2, 102)
                Next cell
            Else
                row.Cells("Target Profit").Style.BackColor = Color.FromArgb(102, 255, 102)
                row.Cells("Avg Loss").Style.BackColor = Color.FromArgb(247, 197, 141)
                row.Cells("Avg Win").Style.BackColor = Color.FromArgb(102, 255, 102)
                row.Cells("Stop Loss").Style.BackColor = Color.FromArgb(247, 197, 141)
                row.Cells("Target Profit").Style.BackColor = Color.Beige
                row.Cells("Signal Name").Style.BackColor = Color.White
            End If
        Next row
    
    End Sub
    

    旁注:您使用不同的颜色设置了两次
    列(“目标利润”)
    。我不知道这是一个简单的oops错误还是复制粘贴错误。

    在if…Then行上设置一个调试中断,当代码停止时,检查值。您可能希望使用ComboBox1.SelectedItem.ToString而不是ComboBox1.Text。顺便说一句,您可以使用row变量:
    row.Cells(“信号名称”).Style.BackColor=Color.White