- PR -

Datagridとダイアログのデータ同期方法

1
投稿者投稿内容
もとべえ
会議室デビュー日: 2004/09/17
投稿数: 16
投稿日時: 2004-09-17 18:09
今、C#(Winアプリ)を使用してメインフォーム(MainForm)にデータグリッドを配置し、Datasetにセットされた1つのテーブルを単純に表示しています。そのデータを編集するためにユーザインタフェースも考慮し、レコードを編集するためのダイアログを表示し、データを入力、キャンセルを押したらレコードを更新せず、OKを押したらレコードを更新するという場合、やり方としていろいろとあるかと思いますが、スマートなやり方があれば教えていただければと思います。

現在はデータグリッドから選択されたDataRowを取得し、そこから各データを各コントロールに渡し、やっています。

試しに、データグリッドから選択されたDataRowView,DataRowをそのままダイアログのコンストラクタに渡し、データバインドしてみました。1度目は編集ができましたが、2度目に編集しようとする際、どれか1つのデータを変更すると、フォーカスがどこにもうつらなくなってしまい、OK,キャンセルが押せなくなってしまいました。

また、DataGridにセットしたDataSetを渡し、更新してみました。これは正常な動作をしますが、ダイアログでデータを入力し、下のデータグリッドの画面が再描画するようにドラッグしてなぞると・・・。OK,キャンセルを押す前に現在入力されたデータが表示されてしまいます。

対処法や他にいい方法があれば、ご教授いただければと思います。
小野@どっとねっとふぁん
ぬし
会議室デビュー日: 2001/10/30
投稿数: 402
投稿日時: 2004-09-17 18:44
ダイアログにはDataSetのコピーを渡して、OKが押されたときだけそのコピーで
元のDataSetを置き換えるとか。

#この手のサンプルがのった本みたことあるような気がするんだけどな。。。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-09-17 19:18
ためしに「プロジェクト」ー「新しい項目の追加」ー「データフォームウィザード」
で「グリッド」ではなく「単一レコードをコントロールで表示」にして、
フォームを一つ作ってみてください。

出来たソースを眺めるといろんなことが見えてきますよ。
もとべえ
会議室デビュー日: 2004/09/17
投稿数: 16
投稿日時: 2004-09-17 20:50
早速のレスありがとうございました。参考になりました。

小野@どっとねっとふぁん様
-----------------------------------------------------------------
なるほど、コレは確かにDataGridへの影響もなく、実際やってみましたら
問題なくできました。もちろんレコード数が多ければ、コピーの段階で、メモ
リを食いつぶしたり、処理も遅くなってしまうかもしれませんね。


えムナウ様
-----------------------------------------------------------------
早速データフォームウィザードを使ってみました。こんな機能があるなんて
知りませんでした。BindingManageBaseクラスのEndCurrentEdit,CancelCurrentEdit
DataSetのAcceptChangesメソッドやDataRowクラスのBeginEditなどを利用しても、
結果は変わりませんでした。WM_PAINTで最新の情報を表示しちゃっている用に見えるので、ちょっと困っています。


DataSetのコピーということで、該当するレコードだけをコピーするという方法もありかと思いましたが、Copyメソッドがないんですね。引き続き対処法を知っている方がいらっしゃいましたら宜しくお願いします。

[ メッセージ編集済み 編集者: もとべえ 編集日時 2004-09-17 20:51 ]
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-09-18 01:28
こんばんは。

参考になるかは分かりませんが・・。

DataSetではなく、DataTableをコピーされてはどうでしょう?

 僕はWinアプリでDataGridのページング機能というのを最近やったんです。
DataSetにDateTable(A)を作って、これが基になるんですけど、例えば3ページ目を表示するならDateTable(A)から3ページ目の開始インデックスから1ページ分のレコードをDateTable(B)にコピーしてそれをDataGridのDataSouceにする事によってページング機能を実現しました。

 データの変更があった場合はDateTable(B)の対象レコードをDateTable(A)に反映してデータベースへの更新はDateTable(A)を指定して行っていました。

 データベースへの掛け渡しとなるDataTableは一つで、それをコピーして色んなDataTableを作成して編集時に基のDataTableに反映させて、最後にそれを元にデータベースを更新。Excelデータのインポートのエラー情報を格納してそれを修正したデータを基のDataTableに反映とか、結構他にも使ってます。
もとべえ
会議室デビュー日: 2004/09/17
投稿数: 16
投稿日時: 2004-09-18 11:06
とっと様
--------------------------------------------------------------------------
レスありがとうございました。
DataTableのコピーをさっそくやってみました。

@DataSet.Cloneを作成
A新しく作ったDataSetのDataTableに該当するレコードをコピー
Bそれをダイアログのコンストラクタに渡し、OKならばDataSetのデータをコピー元のDataSetへ反映
Cそれをデータベースへ反映

簡単にできる方法としてまた選択肢が広がりました。
ありがとうございました。とても参考になりました。

1

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