- PR -

GridViewコントロールで削除機能が動かない

1
投稿者投稿内容
しましま
会議室デビュー日: 2003/04/01
投稿数: 14
投稿日時: 2006-06-13 00:58
お世話になっております、しまです。

表記件について、ご存知の方はお教えください。

[環境]
Windows XP Pro
.NET Framework 2.0
Visual Studio 2005 Professional

[問題]
GridViewコントロールからレコードを削除しようとすると、「入力文字列の形式が正しくありません。 」というエラーが発生する

[状態]
・GridViewコントロールのBoundField列(INT型)を「{0:#,###}」のように整形
・オプティミスティック同時実行制御を有効

[分かっていること]
・削除時に#,###の形式に整形された数値がそのままSQLDataSourceコントロールに渡されているため、数値と認識できずにエラーとなっている(らしい?)
・対象の数値列は主キーでないので、オプティミスティック同時実行制御を無効にすれば、問題なく動作する
・もちろん、#,###への整形をしなければ、問題なく動作する

以上です。もちろん、イベントハンドラから値を再整形して引き渡してやれば、動くと思うのですが、こんな当たり前の処理でコードを記述するのも避けたいですし、プロパティ値の設定などでどうにかならないものかと…
#BoundField列に適用したフォーマットを、削除時には無効にするプロパティなど?

初歩的な質問かもしれませんが、ご存知の方はアドバイスいただければ幸いです。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-06-13 06:22
引用:

[問題]
GridViewコントロールからレコードを削除しようとすると、「入力文字列の形式が正しくありません。 」というエラーが発生する

[状態]
・GridViewコントロールのBoundField列(INT型)を「{0:#,###}」のように整形
・オプティミスティック同時実行制御を有効


「オプティミスティック同時実行制御を有効」にすると、レコードのすべての列(フィールド)が変更されていないことを確認するための「WHERE句」が追加されます。このWHERE句でエラーになっていると思われます。

私は、オプティミスティックを実装するときASP.NETが生成したWHERE句を使用しないで
「タイムスタンプ」または「更新回数」などのフィールドを比較してチェックしています。

この方式ですとフィールドのデータ型を考慮する必要ありません。

例:
DELETE FROM tablename WHERE PrimaryKey=@PrimaryKey AND ConCurrencyID=oldConCurrencyID

_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
しましま
会議室デビュー日: 2003/04/01
投稿数: 14
投稿日時: 2006-06-14 00:55
ご回答ありがとうございます。

なるほど。
これだけのことでわざわざSQL命令を書き換えるのも面倒なので、標準的なConflictDetectionプロパティの設定だけでなんとかできないものかと思っていたのですが、やはり無理なのですね(^^;
#BoundField.ApplyFormatInEditModeプロパティのようなものがあるのではないかと探していました。

これは余談なのですが。
表示のための整形済み文字列がそのままSQLに渡されてしまうこと自体が個人的にはどうにも不自然に思われるのですが、なにか意味がある仕様なのでしょうか??(わざわざ整形した値をoldvalueとして渡す意味がASP.NETの仕様としてどうにも理解できません。。。)
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-06-14 06:35
引用:

BoundField.ApplyFormatInEditModeプロパティのようなものがあるのではないかと探していました。

わざわざ整形した値をoldvalueとして渡す意味がASP.NETの仕様としてどうにも理解できません。。。)


BoundFieldのApplyFormatInEditModeプロパティを「False」に設定しても削除処理が
正常に動作しません。

問題は、楽観的ロックを組み込むときにWHERE句ですべてのフィールドをチェック
していることにあると思います。

今回は、フォーマットの問題で削除処理が正常に動作しなかったわけですが、
このほかにフィールド値が「Null」のときも同じ問題があります。

つまり、フォーマットだけの問題ではありません。

楽観的ロックを実装するには、ASP.NETの仕様に依存しないで独自に実装することを
お勧めします。
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
しましま
会議室デビュー日: 2003/04/01
投稿数: 14
投稿日時: 2006-06-14 11:15
>BoundFieldのApplyFormatInEditModeプロパティを「False」に設定しても削除処理が
正常に動作しません。
はい、ApplyFormatIn"Delete"Modeのようなプロパティがあれば…と思ったのですが(^^;

>このほかにフィールド値が「Null」のときも同じ問題があります。
はい、Nullチェックを追加してやらなければならないというやつですね。これもなんで??と思ってました。

さっきの質問のくりかえしではありますけど、こうしたNullチェックやフォーマットの問題はASP.NET 2.0の不具合なのでしょうか?それとも、意図した仕様なのでしょうか?意図した仕様なのだとすれば、どのような意図があるのかなぁと思いまして。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-06-15 05:48
引用:

さっきの質問のくりかえしではありますけど、こうしたNullチェックやフォーマットの問題はASP.NET 2.0の不具合なのでしょうか?それとも、意図した仕様なのでしょうか?


私の尊敬するDavid Sceppaさんなら、このような仕様(?)にはしないと思いますけどね。ところで、Davidさんの待望のADO.NET 2.0の書籍8月30日ごろ発売されそうですね。今から予約しておかないと・・・
_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
しましま
会議室デビュー日: 2003/04/01
投稿数: 14
投稿日時: 2006-06-15 11:24
なるほどですね。ご回答ありがとうございました。
よく理解できました。

.NET 2.0の書籍、気がついたらずいぶん多くなってきましたね。まだなかなかこれだ、というものに出会えずにいますが、これから良い本が出てくることを期待しています。
1

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