- PR -

GridViewでCommandFieldのButtonTypeをImageにするとRowCommandイベントが2回発生?

1
投稿者投稿内容
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-10-31 00:53
長ったらしいタイトルですみません。
基本的な事だと思いますが、行き詰まってしまったので
アドバイスいただけるとありがたいです。

現在、GridViewで商品を一覧表示して編集する画面のようなものを作ろうとしています。
全ての行にコマンドボタン(「上へ」、「下へ」)を配置して、
それを押すと該当行の表示の順番を変更するという事をやろうとしていますが、
一回のクリックに付き、順番は一つ上または一つ下にしか移動しないように
コーディングしたつもりだったのですが、どうも一つ飛ばしに移動してしまいます。

調べてみると、GridViewのRowCommandメソッドを2回実行しているようです。
あちこち弄くってみて判ったこととしては、
どうやらButtonTypeをImageにした場合にだけそのような現象になり、
LinkやButtonタイプであれば1回のみしか実行されないようです。
表示順変更ボタンだけでなく通常の編集などのボタンでも同様のようですが、
2回実行されても上書きされてしまうだけなので
今まで気づかなかっただけのようです。

なんとも不可思議な現象のように思えますが、ButtonTypeによって
何かしらイベントの発生方法に違いがあったりするのでしょうか?
それとも本来そのようなことはあり得ず、私の設定ミスなどに起因するものと
考えられますでしょうか?

最近VS2005を触り始めたばかりで、GridViewについては
まだあまりよくわかっていないので、よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-10-31 02:26
特にそのような現象はおきないですねぇ。RowCommandにどんなコーディングしてますか?
シンプルなプロジェクトとGridViewを作り直してもそうなりますか?
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-31 03:08
ButtonFieldを追加してButtonTypeをImageにするとRowCommandが2回呼び出されるようです。
とりあえずこのButtonFieldをTemplateFieldに変換するとRowCommandの呼び出しは1回になるようです。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-10-31 10:25
遅くなってすみません。
返信いただきどうもありがとうございました。

まず、書き忘れていたことがあったのですが、今回のはWebアプリケーションです。
Windowsアプリにも似たような名前のコントロールがありますので一応断っておきます。

「べる」さんの言われた件の確認としては、
現象に気づいた時点から少しずつ機能を戻したり、コードを削ったりして、
どこで出なくなるのかというのと、反対に、シンプルなGridViewから
少しずつ足していってどこでおかしくなるのかの両方をやってみました。
結論としては、RowCommandに何もコードが入っていない空のメソッドの場合でも
同じです(ブレークポイントで確認)ので、自分で追加したコードの問題ではなさそうです。
で、シンプルなButtonFieldを追加してButtonTypeをImageに変えたとたんに発生します。
まだ、別プロジェクトにしての確認はできていませんので、そちらはまたやってみます。

「どっとねっとふぁん」さんの情報だとバグということになるのでしょうか?
TemplateFieldに変換して確認しようとしているところですが、
初めてやる事もあってCommandArgumentのあたりで手間取っています。
確認できたらお知らせしたいと思います。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-10-31 10:59
私のところでは基本的には依然発生しないのですが、確かに、何回もクリックしてみると
たまに、RowCommandが2回呼ばれることがあります。
その場合はPage_Loadも2回呼ばれていると思います(つまり2回リクエストしている)。

GridViewでButtonFieldのButtonTypeをImageにするとHTML出力で<input type="image" になる
のですが、なぜかjavascript内でsubmitさせてるみたいなのでタイミングの問題で2重submitして
しまうのかもしれません。TemplateFieldにするとjavascriptは出力されないので現象が起こらないのでしょう。
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-10-31 11:23
私の手元ではButtonFieldを使っている場合は常に2回のリクエストがあがります。
Input type="image"としてのリクエストとJavaScriptのsubmitの2回あがってくるのかな?

#Input type="image"だと常にリクエストがあがるものなのかどうかがよくわかってなかったり(^^;

TemplateFieldにした場合はデータバインディングでキーとなるデータをCommandArgumentに設定してしまうと便利かもしれませんね。
BT
ベテラン
会議室デビュー日: 2006/09/24
投稿数: 81
お住まい・勤務地: Tokyo
投稿日時: 2006-10-31 13:55
どうもお世話になります。

別プロジェクトでも試してみましたが、やはり同じでしたので
プロジェクト依存ではなさそうです。

また、TemplateFieldに変換する方法でやってみることができましたが、
これだと確かに1回のみ呼び出されますね。
とりあえず動作としてはこれでOKなのですが、
環境によって出たり出なかたたりするようですし、
見た限りではimageでもbutton,linkでも生成されるJavaScriptのコードに
全く違いは無いようですので不思議です。

と、ここでもしかしたらIEの問題かもと思いついて
FireFoxで試してみたところ、やはり発生しませんでした。
ということは、IEのinputタグ回りのJavaScriptの処理に原因があるのかもしれません。
それであれば環境によって挙動が違うというのも判ります。
ちなみに、こちらの環境はWin2000,IE6.0です。

今回の問題は、きちんとしたアプリを作ろうとすると最終的にはTemplateに
せざるを得ないと思うので問題ないのだと思いますが、
試作とか、お手軽に作って動かしてみようという人は面食らうでしょうね。
更新は上書きされるだけで問題ないとしても削除はデータがないという
エラーが発生してしまいますので、悩むことになりそうです。

それから、CommandArgumentの使い方がようやく判りましたが、便利ですね。
いままで更新したりするデータは、GridViewのイベントが発生したindexをもとに
DataKeyから値を求めたりしていたのが、CommandArgumentにデータのIDを入れておけば
ダイレクトにアクセスが可能になりコードもスッキリできました。

いろいろと、どうもありがとうございました。
trapemiya
大ベテラン
会議室デビュー日: 2005/07/30
投稿数: 102
投稿日時: 2006-10-31 14:37
私も以前、何かの検索をしていて見かけたのですが、どうもバグらしいですね。VS2005の最初のSPでFixされる予定のようです。
1

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