DataGridViewにFilterをかけたときの再描画

タグの編集
投稿者 hoido  (社会人) 投稿日時 2010/7/3 09:58:07
いつもお世話になっております。
早速ですが、現在フォーム上にTabControlが3個
それぞれのページにDataGridViewExが1個配置されており、DataGridViewExが合計13個配置されています。
すべてのDataGridViewExにFilterをかけているのですがFilter実行時表示が更新されているものもあれば更新されていないものあります。
ただ、実際FilterがかかっていないかというとDataGridViewExを選択すると正常に表示されるのでFilterはちゃんとかかっているようです。

現在のプログラムは下記の通りで、フォーム上からTabControlを検索し、見つかればそのPage内にDataGridViewExがあるかどうか検索。その後入力日等でFilterをかけています。

    Private Sub DataGridFilter()
        Dim SelectDgv As String = ""
        For Each oDgv In Me.Controls
            If oDgv.GetType Is GetType(TabControl) Then '--TabControlの検索
                For Each ooDgv In CType(oDgv, TabControl).Controls
                    If ooDgv.GetType Is GetType(TabPage) Then '--TabPageの検索
                        For Each oooDgv In CType(ooDgv, TabPage).Controls
                            If oooDgv.GetType Is GetType(DataGridViewEx) Then '--DataGridViewExの検索
                                SelectDgv = Replace(CType(ooDgv, TabPage).Name, "Tab_", "")

                                '▼選択日でフィルターをかける
                                If CType(oooDgv, DataGridViewEx).Name = "dgv_" & SelectDgv Then
                                    Dim Table As DataTable = DirectCast(CType(oooDgv, DataGridViewEx).DataSource, DataTable)
                                    Dim View As DataView = Table.DefaultView
                                    Select Case CStr(CType(oooDgv, DataGridViewEx).Tag)
                                        Case "職場1"
                                            View.RowFilter = "入力日 =#" & SelectDay & "# AND 職場ID ='" & CInt(Me.cbo_在籍職場.SelectedValue) & "' AND 社員ID ='" & CInt(Me.cbo_社員名.SelectedValue) & "'"
                                        Case "職場2"
                                            View.RowFilter = "入力日 =#" & SelectDay & "# AND 職場ID ='" & CInt(Me.cbo_在籍職場.SelectedValue) & "'"
                                        Case "仕事"
                                            View.RowFilter = "入力日 =#" & SelectDay & "# AND 仕事内容ID ='" & CInt(Me.cbo_仕事内容.SelectedValue) & "'"
                                        Case Else
                                            View.RowFilter = "入力日 =#" & SelectDay & "# AND 仕事内容ID ='" & CInt(Me.cbo_仕事内容.SelectedValue) & "' AND 社員ID ='" & CInt(Me.cbo_社員名.SelectedValue) & "'"
                                    End Select
                                    Table.Dispose()
                                End If
                            End If
                        Next
                    End If
                Next
            End If
        Next
    End Sub

Refreshも試してみましたがダメでした。
Filter実行時の再描画の良い方法はありませんか?

よろしくお願いいたします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/7/4 12:26:23
> それぞれのページにDataGridViewExが1個配置されており
DataGridViewEx というのは、どのようなクラスなのでしょうか。
System.Windows.Forms.DataGridView クラスと何か関係がありますか?
(タイトルは、DataGridView になっていますが…)

> Filterはちゃんとかかっているようです。
変更通知イベント/メソッドの無いオブジェクトが DataSource に渡されているのかも知れません。
DataSource を BindingSource 経由で渡すようにし、Filter はその BindingSource に
割り当ててみては如何でしょう。
投稿者 hoido  (社会人) 投稿日時 2010/7/5 01:13:04
魔界の仮面弁士様回答ありがとうございます。
>DataGridViewEx というのは、どのようなクラスなのでしょうか。
http://dobon.net/vb/dotnet/datagridview/enterkeymoveright.html
上記を参考にさせて頂き、DataGridViewでEnterを押したとき隣のセルに移動するようにしていました。

>DataSource を BindingSource 経由で渡すようにし、Filter はその BindingSource に割り当ててみては如何でしょう。 
まだやってみたことがなかったので、勉強して挑戦してみます。

ありがとうございました。
投稿者 (削除されました)  () 投稿日時 2010/7/5 02:22:48
(削除されました)