2016-11-02 11 views
1

私はDataGridViewの中で行をハイライトするのRowFilterを使用していますが、私はすべてのレコードを表示するには、フィルタをクリアしたときに、それは私が適用されるハイライトを削除します。RowFilterを使用して、データグリッドビューで行をハイライト表示する方法を教えてください。

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

100Kは本当にあまりにも多くのレコーダーです。 'DataGridView'にすべての100K +レコードを表示しないでください。ページング/フィルタリングのメカニズムを使用し、いくつかの行を表示するだけです。 –

+0

@RezaAghaeiそれは私が達成しようとしているものには本当に適合しません。選択したレコードと選択されていないレコードを比較するために、すべてのレコードをスクロールする必要があります。 – Chrisetiquette

+0

['VirtualMode'](https://msdn.microsoft.com/en-us/)ライブラリ/ 15a31akc(v = vs.110).aspx)を 'DataGridView'に追加しました。 –

答えて

1

あなたが行にいくつかの書式を適用するCellFormattingまたはRowPrepaint evantを使用することができます。この場合、イベントが発生した行の条件を確認し、必要に応じて行にフォーマットを適用すれば十分です。イベントは、単に表示される行のために提起されているので(この場合はcellFormattingよりも高速であるように思われmentioningRowPrePaintためPlutonixに感謝します。)

は、あなたがあまりにも多くの行を持っている場合でも、パフォーマンス上の問題がないだろう。とにかくDataGridViewの行数が多すぎると良い考えではありません。このような場合は、virtualizationやページングのような仕組みを使用する必要があります。

かかわらず、レコード数の、ここで私はあなたがButton1を押した場合は、TextBox1に入力したテキストとそのFirstName始まる行を色付け例です。 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 

あなたはDataGridViewDataSourceとして設定されたデータテーブルにRowFilterを適用すると、それだけでフィルターの行を示しています。だから私はあなたが赤でフィルタリングされた行と黒で他の色を塗りたいので、私はそれを使用しなかったので、すべての行を表示する必要があります。

関連する問題