这可能吗?我目前正在做的只是循环遍历每一行来改变颜色,但这非常慢,因为我还运行查询并根据结果改变颜色。这是一个例子
Part No | Other Columns
-----------------------
Part A | 123456
Part B | 123456
Part C | 123456
Part A | 123456
Part A | 123456
我的查询在哪里Where Part_No = 'Part A'
,使用我当前的方法,我只会运行相同的查询3次。我想要做的是获取第一列上的不同值,检查查询中的值并更改包含该值的行的颜色。
答案 0 :(得分:0)
在这里回答:How to change row color in datagridview?
===
我只是在调查这个问题(所以我知道这个问题大约在3年前发布,但也许它会帮助某些人......)但似乎更好的选择是将代码放在RowPrePaint中事件,这样你就不必遍历每一行,只需要遍历那些行(因此它会对大量数据执行得更好: 附加到活动
this.dataGridView1.RowPrePaint
+= new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
this.dataGridView1_RowPrePaint);
The event code
private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex]..Cells[10].Text))
{
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}
}
答案 1 :(得分:0)
经济的方法是使用Graphics
事件。第一次显示该单元格时将触发此操作。它只会触发可见行,所以它应该更快。
CellFormatting
如果数据来自db(OP提到查询),您应该像数据源一样处理数据。 DGV只是用户对数据的看法。不是对某种颜色的行进行操作,而是根据部件号或任何决定颜色的行为进行操作。您还可以使用此部件号或部件号创建记录视图,并对其进行操作/循环以简化过程。
由于数据可能会发生变化,因此您需要处理2个事件:Then I loop through the grid view to do something like update the data of all colored rows
和CellFormatting
CellValueChanged
将更新颜色,a)用户是否编辑单元格,b)更改单元格值(Private Sub dgv1_CellFormatting(...) Handles dgv1.CellFormatting
' default start up color
If e.ColumnIndex = 3 Then
e.FormattingApplied = ColorMyRow(e.RowIndex, e.ColumnIndex)
Else
e.FormattingApplied = False
End If
End Sub
Private Sub dgv1_CellValueChanged(...) Handles dgv1.CellValueChanged
' if the target cell changes, update
If e.ColumnIndex = 3 Then
ColorMyRow(e.ColumnIndex, e.RowIndex)
End If
End Sub
' DRY
Private Function ColorMyRow(rowIndex As Int32, colIndex As Int32) As Boolean
Dim bass As Color = Color.PeachPuff
Dim pike As Color = Color.SeaShell
Dim salmon As Color = Color.Salmon
Select Case dgv1.Rows(rowIndex).Cells(colIndex).Value.ToString
Case "Bass"
dgv1.Rows(rowIndex).DefaultCellStyle.BackColor = bass
Return True
Case "Pike"
dgv1.Rows(rowIndex).DefaultCellStyle.BackColor = pike
Return True
Case "Salmon"
dgv1.Rows(rowIndex).DefaultCellStyle.BackColor = salmon
Return True
End Select
Return False
End Function
)或c)更改数据源(dgv1.Rows(0).Cells(3).Value = "Mermaid"
)。
最后,不是尝试循环蓝色行,而是可以查询dtParts.Rows(0)(3) = "Pike"
,在这种情况下,DataSource
:
DataTable
颜色会自动改变。