我如何保持行突出显示在一个数据视图使用RowFilter



我使用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 = ""

您可以使用CellFormattingRowPrepaint事件对行应用一些格式化。在这种情况下,只需检查事件为其触发的行的标准,并在需要时将格式应用于该行。(感谢Plutonix提到RowPrePaint,在这种情况下似乎比cellFormatting更快。)

由于该事件仅针对可见行引发,因此即使有太多行也不会出现性能问题。无论如何,拥有太多行的DataGridView不是一个好主意,在这种情况下,您应该使用虚拟化或分页之类的机制。

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

要使示例工作,您需要在表单上有DataGridView1, TextBox1Button1

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应用于您设置为DataGridViewDataSource的数据表,它只显示过滤的行。所以我没有使用它,因为你想把过滤过的行涂成红色,其他的涂成黑色,所以我们需要显示所有的行

相关内容

  • 没有找到相关文章

最新更新