- - PR -
DataGridVewでデータバインディングしている時、主キー、ユニークの重複チェックについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-12-01 22:04
主キーは複合もあるので行でチェックするのがいいという前提で話します
チェック場所はいろんなイベントがあると思います。 ・DataGridVewのRowValidatingイベント ・DataTableのRowChagingイベント ※DBに問い合わせは論外。 他にもあるかもしれんが・・・。あったら教えてください 入力された値をチェックと言うことでDataGridVewのRowValidatingでチェック (ViewのことはViewでチェック) 他のクラスでチェックすると、調査時いろんなソースを追いかけないのと 入力チェックロジックは1つのイベント内にまとめたいためです。 まず、主キー重複、ユニークチェックメソッドはあるのか? System.Data.UniqueConstraintクラスにCheckConstraintと言う メソッドかイベントがあるのはわかったのですが それはパブリックではない(MSDN)にも載ってないので使用できません。 リフレクションで取得できるかと思いましたが無理でした。 それで別の方法でチェックするにはどうしたらいいのかなと 思って質問しました。 今の考えではクラス内部で主キー、ユニークの値を配列で保持して 配列内をチェックしかないのかなと思ってますが・・・。 複合主キーの時はそれぞれの列の値を文字列連結して 1つの文字列として保持する。 DataTableで制約チェックを追加しておけば例外が発生するのですが DataGridVewのDataErrorイベントに制御が移ります。 私はDataErrorイベントは最後の最後の手段と思っています。 DataErrorイベント自体、なんかどんな例外が起こるかわからないから DataErrorイベントで開発者にまかせようというマイクロソフト側 の仕様のような気がしてなりません。 皆さんはどうやっていますか? | ||||
|
投稿日時: 2007-12-01 23:23
DBに問い合わせするのがもっともエレガントで単純だと思うのですが
おまけに確実だし、DBに問い合わせなしだとキー重複エラー可能性があるのでは | ||||
|
投稿日時: 2007-12-02 15:40
http://pc11.2ch.net/test/read.cgi/tech/1162467959/451-453
もしかして同じ方でしょうか。 とりあえず DataTable.PrimaryKey プロパティと DataRowCollection.Contains メソッド を使えばいいんじゃないかな?と思います。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2007-12-02 17:22
ぽぴ王子さん回答ありがとうございます。
恥ずかしいですがずばり同じ人です…。(ばれてましたか…) 結構調べたつもりなんですけどDatarowCollectionのメソッドで大丈夫そうですね!! まだ試していませんができそうです!!ありがとうございました!! | ||||
|
投稿日時: 2007-12-03 11:06
ぽぴ王子さん!!主キーチェックはできました!!
けど、ちょっと気になることがあって…。 これってユニーク制約は無理ですよね・・・。 う〜ん。困ったもんだ | ||||
|
投稿日時: 2007-12-03 11:17
あーそうですね。主キー重複の部分だけ見ていたので、そこだけに 回答してしまいました。 ユニーク制約の場合(というか主キーでも使えるけど)は、DataTable を元に DataView を作って、その DataView の RowFilter プロ パティに条件をセットして Count プロパティで有無を判断する、な んてことをよくやります。 DataView を作っておくのが面倒な場合は、DataTable.Select メソッドを使ったりしますが、なんか遅そうな気がする(計ったわけで はないので変わらないかもしれない)ので、こちらはよっぽどめんど くせぇ〜って時でないと使わないです。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2007-12-03 23:19
ぽぴ王子さん。いや、ぽぴ王子様。
ありがとうございます。大変助かりました。 DataViewのRowFilterで対応できました。 「DataTableを元に DataView を作って」って気になったのですが DataTable.DefaultViewプロパティでDataViewが取得できるみたいです〜 | ||||
|
投稿日時: 2007-12-04 07:06
DataTable.DefaultView を使うと、たとえば DataTable を
DataGridView の DataSource として使っている場合など 元の DataTable の表示に影響を及ぼす場合があります。 DataTable を元に DataView を作るというのはこんな感じ です(言語が書いていないのでC#で)。
_________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 |