如何使用RowFilter在数据网格视图中突出显示行?

时间:2016-11-02 17:54:17

标签: .net vb.net winforms datagridview datarowview

我正在使用RowFilter来突出显示datagridview中的行,但是当我清除过滤器以查看所有记录时,它会删除我应用的突出显示:

Sorter.DtSample.DefaultView.RowFilter = "FirstName = 'John'" 
For Each R0w In Sorter.DataGridView1.Rows
  R0w.defaultcellstyle.forecolor = Color.Red
  Sorter.DataGridView1(0, R0w.index).Value = True
Next
Sorter.DtSample.DefaultView.RowFilter = ""

1 个答案:

答案 0 :(得分:1)

您可以使用CellFormattingRowPrepaint evant将一些格式应用于行。在这种情况下,足以检查事件触发的行的条件,并在需要时将格式应用于行。 (感谢Plutonix的mentioning RowPrePaint,在这种情况下似乎比cellFormatting更快。)

由于事件仅针对可见行引发,因此即使行数太多也不会出现性能问题。无论如何,DataGridView行数太多都不是一个好主意,在这种情况下你应该使用像virtualization或分页这样的机制。

示例

无论记录数量多少,下面都是一个示例,如果您按FirstName,我会将TextBox1开头的行着色为您在Button1中输入的文字。如果您在TextBox1中输入空字符串并按Button1,则所有行都将显示为黑色。

要使示例正常运行,您需要在表单上添加DataGridView1TextBox1Button1

Public Class Form1
    Dim dt As DataTable
    Dim filter As String = ""
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        dt = New DataTable
        dt.Columns.Add("FirstName")
        dt.Columns.Add("LastName")
        dt.Rows.Add("John", "Doe")
        dt.Rows.Add("John", "Smith")
        dt.Rows.Add("Sara", "Allen")
        Me.DataGridView1.DataSource = dt
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        filter = Me.TextBox1.Text
        Me.DataGridView1.Invalidate()
    End Sub
    Private Sub DataGridView1_RowPrePaint(sender As Object, _
        e As DataGridViewRowPrePaintEventArgs) Handles DataGridView1.RowPrePaint
        If (e.RowIndex < 0 OrElse e.RowIndex = DataGridView1.NewRowIndex) Then Return
        Dim row = DataGridView1.Rows(e.RowIndex)

        If (String.IsNullOrEmpty(filter)) Then
            row.DefaultCellStyle.ForeColor = Color.Black
        Else
            Dim data = DirectCast(DataGridView1.Rows(e.RowIndex).DataBoundItem, _
                DataRowView).Row
            If data.Field(Of String)("FirstName").ToLower() _
                                                 .StartsWith(filter.ToLower()) Then
                row.DefaultCellStyle.ForeColor = Color.Red
            Else
                row.DefaultCellStyle.ForeColor = Color.Black
            End If
        End If
    End Sub
End Class

注意

如果您将RowFilter应用于您设置为DataSource DataGridView的数据表,则会显示已过滤的行。所以我没有使用它,因为你想用红色和其他黑色着色过滤的行,所以我们需要显示所有的行。