none
DataGridViewでAccessのようなフィルター RRS feed

  • 質問

  • 現在C#のDataGridViewでAccessのようなフィルターを作成しようとしています。

     

    最初はDataGridViewのDataSourceプロパティに指定しているBidingSourceのFilterプロパティにフィルタ条件を指定してました。

     

    ところがユーザレビューでフィルタ条件を指定した状態でデータを追加、更新するとそのレコードが消えることがあると指摘されました。

     

    当初はフィルタ条件と一致しないレコードなので表示されなくなりますと回答していました。

     

    しかしAccessではそのような事にはならないと指摘されてAccessで試してみた所フィルタを実行した状態でフィルタ条件に合わないレコードを追加したりフィルタ条件に合わないように更新したりしてもレコードが消えませんでした。

    これは、BindingSouceのFilterが設定なのに対してAccessのフィルタが処理の為だと思われます。

     

    C#でAccessのようなフィルタ処理を行って指定された条件に合ったレコードのみ表示する方法はありませんでしょうか?

     

     

    2007年7月9日 0:58

すべての返信

  • 以下でできるのではないかと思います。

     

    BindingSource.RaiseListChangedEvents プロパティ

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.bindingsource.raiselistchangedevents(VS.80).aspx

    2007年7月9日 1:18
    モデレータ
  • ご回答ありがとうございます。

     

    RaiseListChangedEvents をFilterプロパティを設定後にfalseに変更してました。

     

    Code Snippet
            private void button1_Click(object sender, EventArgs e)
            {
                bindingSource.Filter = "Name Like '%あ%'";
                bindingSource.RaiseListChangedEvents = false;
            }

     

    Name 

    ───

    あい

    いあう

    いえお

    かきく

    ───

     

    button1をクリック


    Name 

    ───

    あい

    いあう

    ───

     

    【いあう】を【いう】に更新

     

    Name 

    ───

    あい

    いう

    ───

    例外が発生【System.IndexOutOfRangeException】

     

    データグリッドにバインドされているDataSetの値がFilterプロパティを設定したことにより取得できなくなってしまいました。

     

    RaiseListChangedEventsの使い方が間違っているのでしょうか?

     

    今のところ私が考えている実現方法は、以下の2つです。

     

    データセットにフィルタフラグを追加してフィルタ条件に一致するレコードのフラグを1に設定して

    BindingSourceのFilterにはフィルタフラグ=1とする方法

     

    フィルタが実行されるたびにフィルタ条件に一致する行を新しいデータセットにimportRowして一致する行だけを持つデータセットをDataGridViewにバインドする方法

     

    両者とも無理やりな感じがして思い切れません。

     

    もし何か良案があれば教えていただけませんでしょうか?

    2007年7月9日 5:59
  • SuspendBinding とRaiseListChangedEvents を複合で使ったらどうでしょうか?

     

    以下のメモを見てください。

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.bindingsource.suspendbinding(vs.80).aspx

    2007年7月9日 6:48