我正在使用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 = ""
答案 0 :(得分:1)
您可以使用CellFormatting
或RowPrepaint
evant将一些格式应用于行。在这种情况下,足以检查事件触发的行的条件,并在需要时将格式应用于行。 (感谢Plutonix的mentioning RowPrePaint
,在这种情况下似乎比cellFormatting
更快。)
由于事件仅针对可见行引发,因此即使行数太多也不会出现性能问题。无论如何,DataGridView
行数太多都不是一个好主意,在这种情况下你应该使用像virtualization或分页这样的机制。
示例强>
无论记录数量多少,下面都是一个示例,如果您按FirstName
,我会将TextBox1
开头的行着色为您在Button1
中输入的文字。如果您在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
应用于您设置为DataSource
DataGridView
的数据表,则会显示已过滤的行。所以我没有使用它,因为你想用红色和其他黑色着色过滤的行,所以我们需要显示所有的行。