我的应用中有一个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
...或者其他什么,基本上将有问题的行返回到默认或替代默认样式?
答案 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
颜色是交替行背面颜色):
然后,如果我更改第二个玫瑰色行的状态,它会正确使用AlternatingBackColor
: