我使用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 = ""
您可以使用CellFormatting
或RowPrepaint
事件对行应用一些格式化。在这种情况下,只需检查事件为其触发的行的标准,并在需要时将格式应用于该行。(感谢Plutonix提到RowPrePaint
,在这种情况下似乎比cellFormatting
更快。)
由于该事件仅针对可见行引发,因此即使有太多行也不会出现性能问题。无论如何,拥有太多行的DataGridView
不是一个好主意,在这种情况下,您应该使用虚拟化或分页之类的机制。
无论记录的数量如何,这里有一个示例,如果您按下Button1
,我将FirstName
以您在TextBox1
中输入的文本开头的行着色。如果您在TextBox1
中输入空字符串并按Button1
,则所有行将显示为黑色。
要使示例工作,您需要在表单上有DataGridView1
, TextBox1
和Button1
。
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
应用于您设置为DataGridView
的DataSource
的数据表,它只显示过滤的行。所以我没有使用它,因为你想把过滤过的行涂成红色,其他的涂成黑色,所以我们需要显示所有的行