C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: DataGridViewの表示絞り込みについて


(過去ログ 90 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■54012 / inTopicNo.1)  DataGridViewの表示絞り込みについて
  
□投稿者/ komeko (5回)-(2010/10/02(Sat) 14:21:20)

分類:[VB.NET/VB2005 以降] 

VB2008 ExpressEdition
WinXP SP2

お世話になります。

DataGridViewにCSV形式で貼り付けた表を対象にして
ユーザーがTextboxに入力した文字列を特定のカラムに
対して検索し、Visibleを変更するロジックを考えました。

対象のDataGridViewの行数が100くらいならいいのですが
2000を超えるものを検索するとレスポンスが極端に悪く
なります。(100:数秒、2000:1分くらい)

部分一致で考えているのでIndexOfを使いましたがこれが
原因でしょうか?

レスポンスの上がる良い方法をご教授ください。お願いします。

        If TextBox1.Text = "" Then
            For i = 0 To DataGridView1.RowCount - 1
                DataGridView1.Rows(i).Visible = True
            Next
        Else
            Dim RetStr As String = TextBox1.Text
            For i = 0 To DataGridView1.RowCount - 1
                Dim IndStr As String = DataGridView1.Rows(i).Cells(2).Value
                If IndStr.IndexOf(RetStr, 0) > -1 Then
                    DataGridView1.Rows(i).Visible = True
                Else
                    DataGridView1.Rows(i).Visible = False
                End If
            Next
        End If


引用返信 編集キー/
■54020 / inTopicNo.2)  Re[1]: DataGridViewの表示絞り込みについて
□投稿者/ ぽぴ王子 (503回)-(2010/10/02(Sat) 17:51:54)
ぽぴ王子 さんの Web サイト
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

引用返信 編集キー/
■54021 / inTopicNo.3)  Re[2]: DataGridViewの表示絞り込みについて
□投稿者/ komeko (6回)-(2010/10/02(Sat) 18:26:37)
No54020 (ぽぴ王子 さん) に返信
> ■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

ぽぴ王子さま

ご回答ありがとうございました。
サンプルソースまで頂きありがとうございました。
DataTableというのはデータベースから直接データを取り込むときに使うものだと
思い込んでいました。これを機会にしっかり理解しておきたいと思います。
少々お時間頂いて考えます。
引用返信 編集キー/
■54023 / inTopicNo.4)  Re[3]: DataGridViewの表示絞り込みについて
□投稿者/ komeko (7回)-(2010/10/02(Sat) 20:14:20)
No54021 (komeko さん) に返信
> ■No54020 (ぽぴ王子 さん) に返信
>>■No54012 (komeko さん) に返信

ぽぴ王子さま

結果、めちゃくちゃレス早くなりました。
こんなやり方出来るんですね。
本当にありがとうございました。


    Private Sub Dialog4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim dt As DataTable
        Dim dr As DataRow

        dt = New DataTable()

        dt.Columns.Add("A", GetType(String))
        dt.Columns.Add("B", GetType(String))
        dt.Columns.Add("C", GetType(String))
        dt.Columns.Add("D", GetType(String))
        dt.Columns.Add("E", GetType(String))
  
        Using Reader As New IO.StreamReader("C:\test.csv", System.Text.Encoding.GetEncoding("Shift-JIS"))
            Dim Line As String = Reader.ReadLine
            Dim Items() As String
            Line = Reader.ReadLine
            Do Until IsNothing(Line)
                Items = Line.Split(",")
                dr = dt.NewRow()
                For z = 0 To Items.Length - 1
                    dr(z) = Items(z)
                Next
                dt.Rows.Add(dr)
                Line = Reader.ReadLine
            Loop
        End Using

        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("B LIKE '%{0}%'", TextBox1.Text)
        End If
    End Sub

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -