更改组合框值时,Datagridview不会更改颜色

时间:2015-06-04 17:25:02

标签: vb.net datagridview colors

我对数据网格有以下问题。

我有一个datagridview,其中有几列已经着色,还有一个组合框。我的datagridview的第一列,"信号名称"具有与组合框相同的值。

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

我已尝试过以下代码,但它没有&#t;#34;重置"我运行时的初始颜色。相反,所需行的颜色被正确更改,但是当我将组合框的值更改为另一个值时,它不会重置为通常的颜色,我最终会将两行着色。

    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

此代码假设将所有列重置为其初始颜色,然后仅为组合框行着色。然而,它没有。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

首先,请遵循LarsTech提出的建议。

接下来,请注意颜色变化的逻辑:

  1. 您可以为每列设置默认颜色。这很有效。
  2. 如果行的第一个单元格值与ComboBox选项匹配:
    1. 颜色Cells("Signal Name")深蓝色。 (冗余到下一行)。
    2. 将该行的默认颜色设置为深蓝色。 (覆盖列颜色)。
  3. 否则:
    1. 颜色Cells("Signal Name")白色。这很有效。
  4. 设置了行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
    

    附注:您使用单独的颜色设置Columns("Target Profit")两次。我不知道这是否是一个简单的 oops 或复制粘贴错误。