- - PR -
GridViewの自動DataBindのタイミングについて
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-06-19 19:27
いつも参考にさせて頂いています。
ASP.NET2.0でGridViewにデザイン時にObjectDataSourceを設定しております。 (自動バインド?って言うんですか?コード内ではBindしていません。) 画面には検索ボタンを用意し、押されたら検索条件に従って、GridViewに一覧表示しています。(同一画面です。) 困っている事があります。 一度GridViewに一覧表示後、画面の内容をまったく変えずに検索ボタンを押すと、 同じ結果が表示されるのですが、ObjectDataSource内のSelectメソッドが二回呼ばれてしまいます。 イベントの順番として、 1.ObjectDataSource内のSelectメソッド 2.PageLoadイベント 3.検索ボタンClickイベント 4.ObjectDataSource内のSelectメソッド また、この現象が起きている画面と同じレイアウトの作りをしている画面では1〜3のイベントしか発生していません。 違いが無いか確認しているのですが、Select文が違ったり、項目の数が違うだけで、 これらのイベントに影響しそうなプロパティ等は同じになっていました。 こういった事が起こりそうな設定や原因がありましたら教えて下さい。 ちなみに、GridViewとObjectDataSourceのEnableViewStateはFalseでページングをおこなっています。 AppCode内にDataSetを用意し、検索条件が動的に変わる為、パーシャルクラスを用意し、このクラスをObjectDataSourceから呼び出すようになっています。 分かりにくい説明で申し訳ありませんが、宜しくお願い致します。 |
|
投稿日時: 2008-06-20 13:06
Page_Loadの前にObjectDataSourceのSelectが発生する、というのがちょっと理解できません。
通常のバインドはPageでいうとPreRenderとPreRenderCompleteの間に発生するので、4のSelectが起きてるのはわかるんですが。 > AppCode内にDataSetを用意し、検索条件が動的に変わる為、パーシャルクラスを > 用意し、このクラスをObjectDataSourceから呼び出すようになっています。 ObjectDataSourceから呼び出す、というのはどうやってるんでしょうか? そのあたりの関係なのかなぁ。。。 |
|
投稿日時: 2008-06-20 17:35
どっとねっとふぁんさん、ご回答ありがとうございます。
>Page_Loadの前にObjectDataSourceのSelectが発生する、というのがちょっと理解でき >ません。 >通常のバインドはPageでいうとPreRenderとPreRenderCompleteの間に発生するので、 >4のSelectが起きてるのはわかるんですが。 確かに不思議なのですが、通常の新規表示時は予想通り2,3,4の順番で動作します。 また、4はPreRenderで発生しています。 しかし、画面を一度表示した後の動きとして、1,2,3が他の画面でも起きています。 1はProcessPostDataで発生しています。 問題の画面は1,2,3,4と4の分が多い状態です。 >ObjectDataSourceから呼び出す、というのはどうやってるんでしょうか? >そのあたりの関係なのかなぁ。。。 ObjectDataSourceのSelectメソッドに対象のDataSetクラスのTableAdapterを設定しています。GridViewのDataSourceIDに上記ObjectDataSourceを設定しています。 全てデザイン時に設定済みです。その為、ソース上で明示的にBindしたりはしていません。 他に何か確認した方が良い所がありましたら、ご教授願います。 宜しくお願い致します。 |
|
投稿日時: 2008-06-20 18:47
> しかし、画面を一度表示した後の動きとして、1,2,3が他の画面でも起きています。
> 1はProcessPostDataで発生しています。 EnableViewStateはFalseということなので、ViewStateを使っていればそこから元の表示データを復旧させるところをSelectでデータを取り出してきてるんですね。 納得できました。 で、 「一度GridViewに一覧表示後、画面の内容をまったく変えずに検索ボタンを押すと、」 ここで、「検索ボタンを押」しているので、検索条件が同じ検索動作をしているはずです。 だから、通常のBindingが発生し、Selectが発行されているのだと思います。 他のページでも「検索ボタンを押す」のと同様の操作が行われているのでしょうか? この部分がちょっと違うんじゃないかと思います。 |
|
投稿日時: 2008-06-20 19:01
どっとねっとふぁんさん、ご回答ありがとうございます。
>EnableViewStateはFalseということなので、ViewStateを使っていればそこから >元の表示データを復旧させるところをSelectでデータを取り出してきてるんですね。 >納得できました。 ProcessPostDataはデータを復旧させる処理なんでしょうか? ViewStateがTrueなら、前回の表示に戻す処理、Falseなら新しく検索するという感じですか? 4のイベントでは、1のイベントと違う時に動作するというイメージでしょうか? >他のページでも「検索ボタンを押す」のと同様の操作が行われているのでしょうか? >この部分がちょっと違うんじゃないかと思います。 他の画面でも同じ操作をしていますが、4のイベントが発生しません。 4画面が同じ構成で、4のイベントが発生するのが1画面だけです。 ソースも照らし合わせても、同じ構成をしています。 4のイベントでBindingされるのが正しい処理なのでしょうか? よく分からなくなってきました。 宜しくお願い致します。 |
|
投稿日時: 2008-06-20 19:42
検索ボタンを押したときにどんな処理が動くんでしょう。
検索のためのキーはどのように設定しているか、とかですね。 そのあたりはまったく同じですか? あと、検索のキーを入力して、「検索ボタンを押さずに」実行キーを押しているような場合なら、入力欄というかテキストボックスが1つしかないか、複数あるかで動作が異なったように思います。 そのあたりもまったく同じですか? [ メッセージ編集済み 編集者: どっとねっとふぁん 編集日時 2008-06-20 19:43 ] |
|
投稿日時: 2008-06-24 09:54
どっとねっとふぁんさん、ご回答ありがとうございます。
遅くなりまして申し訳ありません。 >検索ボタンを押したときにどんな処理が動くんでしょう。 >検索のためのキーはどのように設定しているか、とかですね。 >そのあたりはまったく同じですか? 検索の為のキーは、ObjectDataSourceのSelectParametersに検索条件の コントロールを直接設定しています。 また、検索ボタンを押した時の処理として、SelectParametersの一つに対して 設定をしています。 この一つはどの画面でも設定している値で、どの画面も同じ値を設定しています。 その他に、GridViewのPageIndexを0に戻しています。 その為、検索ボタンの処理は他の画面とまったく同一となっています。 SelectParametersの数が違うだけです。(どの画面も複数あります。) >あと、検索のキーを入力して、「検索ボタンを押さずに」実行キーを押している >ような場合なら、入力欄というかテキストボックスが1つしかないか、 >複数あるかで動作が異なったように思います。 >そのあたりもまったく同じですか? 「「検索ボタンを押さずに」実行キーを押しているような場合」というのは、 例えば、GridViewでページングを有効にしている時にページ番号をクリックした時という事ですか? すみません、イメージが付きません。 もうちょっと詳しく教えていただけますか? 宜しくお願い致します。 |
|
投稿日時: 2008-06-24 19:46
えと、テキストボックスがある場合、テキストボックス内にカーソルがある状態で実行キーを押すとポストバックが発生します。
「ボタンをクリックせずに」というのは上記の状態を指して記述しました。 そういったことはまったく行っておらず、常に検索ボタンをクリックしている、ということでよいでしょうか? あとは何が考えられるかなぁ。。。 検索条件のコントロールの内容が、4のSelectが発生するページだけ毎回設定されている(毎回変更されていると認識されている)ということはありませんか? |