- PR -

DataViewでFilter対象列を編集しても行構成が変わらないようにしたい

1
投稿者投稿内容
なゆた
会議室デビュー日: 2007/06/05
投稿数: 11
投稿日時: 2008-06-19 14:26
環境:VB.net 2005
Windows.Form


DataGridViewにバインドしたDataViewで、Filterの対象列をユーザーが編集すると、レコード確定時にFilterが効いてしまって行が消えてしまいます。
ユーザーが縦に移動しながら連続して編集処理をする&処理内容を確認したい場合、この動作だと問題があるので、Filter対象列を編集しても行構成が変わらないようにしたいと要望されています。

現在DataTeblに別に隠しFilter列を設けて毎回書き換えることで対応していますが、処理速度の問題、行の編集状態のコントロールもしなくてはならないなど動作的にも煩雑なので、もっと簡単に実現する方法がないかと思ってます。


現在の処理手法
1.[syscolFilter]を対象のDataTableに用意。
2.ユーザーがDataGridViewで[ColA=1]と指定するのをバインドしたDataViewAのRowFilterで捕まえる。
3.DataViewBを新しく生成し[ColA=1]を適用。先頭からループさせ[syscolFilter]に一意の値xをセット。
3.DataViewA.RowFilterに[syscolFilter=x]を設定。


どなたかスマートな解決方法をご存じないでしょうか。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-06-19 14:40
頭の中で考えただけですが、

1. DBからレコードを取得するときに、A列(変更対象列)と同じ内容をA'列として取得する。
# SELECT hoge, hoge as hoge2 みたいな
2. A'列は、DataGridViewでは非表示列にバインドする。ユーザはA列を操作する。
3. フィルタはA'列に適用する。
4. DBを更新するときは、A列の内容を使って更新する。

てのはどうでしょうか。
なゆた
会議室デビュー日: 2007/06/05
投稿数: 11
投稿日時: 2008-06-19 15:01
返答ありがとうございます。

仕様の詳細が不足していたようですすみません。
残念ながらFilter列は組み合わせも含めてユーザーが動的に指定できるので、アドバイスいただいた方法だと実現できないのです。
要件として、もう一度「絞込」を行ったら編集したデータを元にフィルタされるというのもありました。
サーバーに書き込みに行かず、DataTable単体で処理を繰り返します。

イメージとしてはAccessのデータシートやExcelと同等の操作です。


データの編集だけではFilterやSortが実行されないのがベストなのですけどね。

[ メッセージ編集済み 編集者: なゆた 編集日時 2008-06-19 15:02 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-06-19 20:56
現状とあまり変わってないかもしれないけど、
DataTableに更新フラグを持たせるってのはどう?

編集を行った場合は、更新フラグを0以外にし、
Filterには(更新フラグ = 0) and (...)を設定する様にしたら、消えなくなるとオモ。

最後に確定した段階で、すべてのフラグを折っておけば、その時点で対象行が消えるって寸法。
更新フラグを0以外にするタイミングは、EndEdit()を呼ぶ時かな。

なゆた
会議室デビュー日: 2007/06/05
投稿数: 11
投稿日時: 2008-06-19 21:42
なるほど、これで対応できますね。AndじゃなくてORか。

EndEditでsyscolFilterに一抽出ごとに固有の値xを書き込んでやれば
(ColA=1) Or (syscolFilter=x)
で、ColAの値をユーザーが変更してもOK。

ありがとうございます。だいぶ改善しそうです。


もしFilter処理そのものを止める方法などご存知の方がいましたら、追加情報お待ちしております。
1

スキルアップ/キャリアアップ(JOB@IT)