DataGridView单元格BackColor未正确格式化

时间:2017-09-21 08:50:05

标签: .net vb.net datagridview formatting

我的应用中有一个datagridview,列出了活动作业。 其中一列有状态代码(0-5),行根据此值着色,如此...

     joblist.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Aquamarine
     joblist.Rows(e.RowIndex).DefaultCellStyle.ForeColor = Color.Black

如果状态代码为0,则不应用任何颜色。

这一点大部分工作正常,但我发现如果它到达状态为0的多个作业,这些作业将采用状态为1-5的最后一个作业的颜色。

我可以通过添加...来解决这个问题。

     elseif status=0 then
     joblist.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Aquamarine
     joblist.Rows(e.RowIndex).DefaultCellStyle.ForeColor = Color.Black
     end if

然而,这消除了我的替代行颜色,所以如果是一块白色的,它们会变得难以阅读。

有没有办法可以说像......

  if status=0 then
  joblist.Rows(e.RowIndex).DefaultCellStyle.BackColor = DefaultCellStyle.BackColor
  joblist.Rows(e.RowIndex).DefaultCellStyle.ForeColor = DefaultCellStyle.BackColor

...或者其他什么,基本上将有问题的行返回到默认或替代默认样式?

1 个答案:

答案 0 :(得分:1)

您的摘要不会给出很多背景信息。例如,我们不知道您正在使用哪个事件,并且有几个好的候选人。如果DGV是只读的或单元格值无法更改,RowPrePaint是一个很好用的,因为行颜色将只设置一次。如果它可以改变,那么CellFormatting对我来说更有意义。

无论哪种方式,要将它们设置回来,都要进行简单的计算并使用DefaultCellStyle颜色。这会将行返回颜色MistyRose设置为状态3,如果更改为其他内容,则返回到该行的默认值:

If e.ColumnIndex = 2 Then
    If DirectCast(e.Value, Int32) = 3 Then
        dgv1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.MistyRose
    Else
        Dim clr = If(e.RowIndex Mod 2 = 0, dgv1.DefaultCellStyle.BackColor,
                     dgv1.AlternatingRowsDefaultCellStyle.BackColor)
        dgv1.Rows(e.RowIndex).DefaultCellStyle.BackColor = clr
    End If
End If

初始结果(淡黄色Consilk颜色是交替行背面颜色):

enter image description here

然后,如果我更改第二个玫瑰色行的状态,它会正确使用AlternatingBackColor

enter image description here