none
ASP.NETの仕組み RRS feed

  • 質問

  • お世話になっております。初歩的な質問となるのでしょうが、いろいろ調べてもわかりませんでした。 Page_Load(・・・)のなかで、常に下記のソースが実行されるようにすると、イベントハンドラがコールされませんでした。ちなみに、authorsDataSet1とデータバインドしているコントロールは、DataGirdコントロールです。またイベントを発生しているコントロールも同コントロールです。但しIsPostBackを使用してポストバック時には、下記のソースを実行させないとイベントハンドラがコールされております。おそらく仕組み上理由が有りそうですが、その概念をしりたいと思っております。  sqlDataAdapter1.Fill(authorsDataSet1);  DataBind(); ご教授お願いします。
    2006年11月6日 1:44

回答

  • ASP.NETにおけるイベントは、ポストバックで成り立っています。ページロードのイベントはポストバックのたびに発生します。
    ページロードのイベントハンドラと、コントロールのイベントハンドラにブレークポイントを貼ってデバッグし、データセットの状態を追ってみれば、なぜコントロールのイベントハンドラがコールされないように”見える”のかが理解できると思います。
    2006年11月6日 2:34
  • ASP.NETのイベントは、クライアントからどのようなリクエストがあがってきたかによって発生します。
    ViewStateに保持されている前回の表示データと入力されてリクエストに含まれるデータを比較して発生する場合もありますし、リクエストに含まれる__EVENTTARGETや__EVENTARGUMENTの値を分析して発生するイベントもあります。

    その意味では、該当するようなデータがリクエスト中に含まれるかのようにサーバが受け取ったデータを改竄できればイベントを発生させることはできるかもしれません。
    ただし、その場合Page_Loadでタイミング的に遅くないかどうかは調べてみないとわかりません。またプログラムはその場その場でしか使えないようなコーディングになりそうですね。

     

    2006年11月6日 5:33

すべての返信

  • ASP.NETにおけるイベントは、ポストバックで成り立っています。ページロードのイベントはポストバックのたびに発生します。
    ページロードのイベントハンドラと、コントロールのイベントハンドラにブレークポイントを貼ってデバッグし、データセットの状態を追ってみれば、なぜコントロールのイベントハンドラがコールされないように”見える”のかが理解できると思います。
    2006年11月6日 2:34
  • 早速のご返事ありがとうございました。

     DataGridコントロールのプロパティ値などが、DataBindを行なうことで初期値に戻っているみたいです。

    おそらく、イベントの順番として、Page_Load→Control_eventsとなっているので、Page_Loadでコントロールが初期化されているため、Control_eventsで設定されていたイベントが発生できなかったと思われますが、どこのプロパティを参照したらよいのでしょうか。

    極端に言えば、Page_Loadでコントロールに対してイベントを設定することで、クライアントからではなくでも発生できそうな気がします。

    教えて頂けませんでしょうか。よろしくお願いします。

    2006年11月6日 4:22
  • ASP.NETのイベントは、クライアントからどのようなリクエストがあがってきたかによって発生します。
    ViewStateに保持されている前回の表示データと入力されてリクエストに含まれるデータを比較して発生する場合もありますし、リクエストに含まれる__EVENTTARGETや__EVENTARGUMENTの値を分析して発生するイベントもあります。

    その意味では、該当するようなデータがリクエスト中に含まれるかのようにサーバが受け取ったデータを改竄できればイベントを発生させることはできるかもしれません。
    ただし、その場合Page_Loadでタイミング的に遅くないかどうかは調べてみないとわかりません。またプログラムはその場その場でしか使えないようなコーディングになりそうですね。

     

    2006年11月6日 5:33
  • Page_Loadイベントはポストバックで必ず発生するため、
    Page.IsPostBack プロパティを確認して、
    Page_Loadイベント内で行う処理を初回表示時と
    ポストバック時に切り替える方法が一般的かと思います。

    初期表示時にはDataBindを行いポストバック時にはDataBindを
    行わなくても表示状態は保持されます。

    2006年11月6日 10:05
  • ご返事ありがとうございます。

    ViewStateに保持されている値は前回のもので、Page_LoadでDataBind()を行なってしまうとコントロールが初期化され、前回と同じ値となるため比較時に変更なしとなるためイベントが発生しないのですね。何となくわかってきました。

    ありがとうございました。

    2006年11月6日 10:49