3

ASP.NET 1.0 / 1.1の時代には、実行時に作成されたコントロールは、ページライフサイクルPage_Loadのイベントの前(つまり、内部)に追加する必要があると確信しています。Page_Init

これは、Microsoftによる1つの記事です(.NET 1.0 / 1.1の場合):方法:
ASP.NETで動的にコントロールを作成する

注Webフォームで動的コントロールを作成する場合は、コントロールを作成し、Page_InitイベントハンドラーまたはPage_Loadイベントハンドラーのいずれかでコントロールコレクションに追加する必要があります。そうしないと、コントロールが期待どおりに動作しない可能性があります。

ただし、ここにあるいくつかの投稿では、上記はもう当てはまらないようです。内に追加されたコントロールPage_Loadは、他のすべての人のために機能しているようです。いくつかの投稿には次のものが含まれます:
asp.netビューステートでの動的制御の作成
-完全な混乱。

私はそれを自分で試しましたが、予期しない動作を見つけるのに十分なテストを行っていませんでしたが、実際に機能しました。

ではPage_Load、動的制御を追加するための安全な段階はありますか?それとも、.NET 2.0以降のみですか?

4

3 に答える 3

3

私はこれを Reflector で調べましたが、Control クラスは、いつ追加しても、動的に追加するときに実際に速度を上げます。ビューステート/コントロールステートの読み込み、ポストバック イベントの呼び出し、イベント ハンドラーの呼び出しなど、すべてを行います。

「危険」については、経験の浅いユーザーがつまずく可能性のある問題がいくつかあるため、Page_Init またはそれ以前にそれらを追加することをお勧めします。(PreInit イベントはページ自体にのみ適用され、マスター ページやサブコントロールには適用されないことに注意してください)。頭のてっぺんから(他にもいくつかあると思います):

  • デフォルトでは、ビューステートは位置的にロードされます。つまり、コントロール ID を無視し、ビューステートを読み込むときにツリー内のコントロールの配置のみを考慮します。ビューステートがシリアル化されたときに動的コントロールが存在し、逆シリアル化されたときに存在しない場合、間違ったビューステート項目が間違ったコントロールに割り当てられ、例外が発生する可能性があります。これは、いくつかの設定で変更できますが、今では検索するのが面倒です。
  • 動的コントロールがページに追加されると「高速化」が行われるため、一部のイベントの順序は予期しないものになる場合があります。たとえば、Page_PreRender イベントで TextBox コントロールをページに追加すると、そこで TextBox の Changed イベントが発生します。イベント ハンドラー コードが、PreRender の前に残りの部分で発生するイベントに依存している場合、失敗します。
于 2009-11-10T15:12:51.317 に答える
2

コントロールはいつでも追加できます。ただし、ページが読み込まれる前に追加した場合は、ビューステートでのみ機能します。

実際、投稿したページ ライフサイクル リンクの .Net 2.0 バージョンを確認すると、PreInit イベントの下に次の引用が見つかります。

このイベントは次の目的で使用します。 ... 動的コントロールを作成または再作成します。

于 2009-11-10T14:18:40.830 に答える
1

Page_Load イベント ハンドラーは、コントロールを追加するのに適した場所です。あなたのメモを読み直すと、彼らがそう述べていることに気付くでしょう。

注: Web フォームで動的コントロールを作成する場合は、コントロールを作成し、Page_Init イベント ハンドラーまたは Page_Load イベント ハンドラーのいずれかでコントロール コレクションに追加する必要があります。そうしないと、コントロールが期待どおりに動作しない場合があります。

リンク先の ASP.NET 2.0 記事の場合、「追加されたコントロールのキャッチアップ イベント」の下で、追加されたコントロールがページでどのように高速化されるかについて説明しています。

于 2009-11-10T14:27:35.447 に答える