更改包含特定值的每个datagridview行的颜色

时间:2016-06-20 23:22:26

标签: vb.net visual-studio-2008 datagridview

这可能吗?我目前正在做的只是循环遍历每一行来改变颜色,但这非常慢,因为我还运行查询并根据结果改变颜色。这是一个例子

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次。我想要做的是获取第一列上的不同值,检查查询中的值并更改包含该值的行的颜色。

2 个答案:

答案 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 rowsCellFormatting

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

颜色会自动改变。