質問者
DataGridViewでAccessのようなフィルター

質問
-
現在C#のDataGridViewでAccessのようなフィルターを作成しようとしています。
最初はDataGridViewのDataSourceプロパティに指定しているBidingSourceのFilterプロパティにフィルタ条件を指定してました。
ところがユーザレビューでフィルタ条件を指定した状態でデータを追加、更新するとそのレコードが消えることがあると指摘されました。
当初はフィルタ条件と一致しないレコードなので表示されなくなりますと回答していました。
しかしAccessではそのような事にはならないと指摘されてAccessで試してみた所フィルタを実行した状態でフィルタ条件に合わないレコードを追加したりフィルタ条件に合わないように更新したりしてもレコードが消えませんでした。
これは、BindingSouceのFilterが設定なのに対してAccessのフィルタが処理の為だと思われます。
C#でAccessのようなフィルタ処理を行って指定された条件に合ったレコードのみ表示する方法はありませんでしょうか?
すべての返信
-
以下でできるのではないかと思います。
BindingSource.RaiseListChangedEvents プロパティ
-
ご回答ありがとうございます。
RaiseListChangedEvents をFilterプロパティを設定後にfalseに変更してました。
Code Snippetprivate 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にバインドする方法
両者とも無理やりな感じがして思い切れません。
もし何か良案があれば教えていただけませんでしょうか?
-