|
■No54012 (komeko さん) に返信
> VB2008 ExpressEdition
> WinXP SP2
>
> お世話になります。
>
> DataGridViewにCSV形式で貼り付けた表を対象にして
> ユーザーがTextboxに入力した文字列を特定のカラムに
> 対して検索し、Visibleを変更するロジックを考えました。
>
> 対象のDataGridViewの行数が100くらいならいいのですが
> 2000を超えるものを検索するとレスポンスが極端に悪く
> なります。(100:数秒、2000:1分くらい)
>
> 部分一致で考えているのでIndexOfを使いましたがこれが
> 原因でしょうか?
>
> レスポンスの上がる良い方法をご教授ください。お願いします。
まず DataGridView にデータを設定するときに、DataTable を使用するのがいいのではないでしょうか。
そして DataTable から DataView を作成してデータソースとして使用すると、フィルタリングも楽に
なりますし、自分で検索して表示を切り替えるよりも速いかと思います。
イメージとしてはこんな感じ。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim dt As DataTable
dt = New DataTable()
dt.Columns.Add("Column1", GetType(String))
dt.Columns.Add("Column2", GetType(String))
dt.Columns.Add("Column3", GetType(String))
dt.Rows.Add("A", "B", "C")
dt.Rows.Add("Z", "AAA", "Q")
dt.Rows.Add("1", "ABC234", "G")
dt.Rows.Add("!$!$", "BZBZA()", ".")
dt.Rows.Add("$$", "$$", "$$")
このへんはCSV取り込みの時に適宜変更していただくとして…
Dim dv As DataView
dv = New DataView(dt)
DataGridView1.DataSource = dv
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dv As DataView = CType(DataGridView1.DataSource, DataView)
DataGridView1.DataSource = dv
If TextBox1.Text = "" Then
dv.RowFilter = ""
Else
dv.RowFilter = String.Format("Column2 LIKE '%{0}%'", TextBox1.Text)
End If
End Sub
|