ページ

2011年5月24日火曜日

◆@IT の連載「データベースプログラミング入門」で嵌る

以下の人と全く同じ症状で半日嵌る。

DataSet にバインドした DataGridView で新規追加時にエラー: DOBON.NETプログラミング掲示板過去ログ

VisualStudio(.Netframework)のバージョンが違うからか、とか自分の操作が間違っているのかとか色々と悩んだがこの人の環境を見ると@ITで解説している記事と同じ環境のようなのでどうやら解説自体が中途半端な可能性大。

現象としては、マスター詳細フォームで新規マスターの追加ボタンを押し、マスターになにか入力した状態で詳細入力するとエラーになる。

なぜか、マスターに何も入力せずに詳細入力するとエラーにならないので記事の筆者はそのような操作しかしていないのではなかろうか。

まぁ、それは良として、なぜエラーになるのか。
はっきり行って素人には全く解らない。
エラーになっているのはどう見ても自動生成部分なのでVisualStudioのバグの可能性もある。
詳細データのAddイベントが何故か複数発生していてEndEditが複数回呼ばれているのが悪さしている風。
昔からコントロールのイベントというのは厄介だ。

個人的には此の様なGUIでちょこちょこするのは好きなスタイルなのだが、完成度が低いとGUIアレルギーな人たちを沢山産み出してしまう。

品質がいまいちだから使われないのか、使われないから品質がいまいちなのか。

といった話は置いておいて、此の様な場合は本質的な解決は難しいので対症療法的回避措置で逃げるに限る。

そもそも詳細レコードが追加されたDataGridView_RowsAddedイベントでマスターのEndEditを呼び出していのが事を難しくしていないだろうか。

黙って、マスターレコードが追加されたときにEndEditしておけば確実のような。
あまり、これはというイベントは無かったがとりあえず以下のような感じで良いのではないだろうか。

        private void 注文BindingSource_PositionChanged(object sender, EventArgs e)
{
this.注文BindingSource.EndEdit();
}


どっちにしても、DataSetの制約を有効にしてプログラミングするのは得るものより労力の方が大きい気がするのだが、世の中の人はどうしているのだろう。


私のまわりではDataSetの制約どころか、DBの外部キー制約自体使っているのを見たことがない。


実システムではこのサンプルのように何もチェックをしないことはありえないのでマスターのチェックがOKになった段階でEndEditを呼び出し、詳細を入力させるとかになるのだろう。

0 件のコメント:

コメントを投稿

私が最近チェックした記事