2

使用可能なインデックスに応じて、ページが特定のコントロールをロードするプロジェクトに取り組んでいます。ロードは、メソッドPopulateSearchFieldが呼び出されるページロードで発生します。

このメソッド内で、すべてのUserControlは、次を使用してページに追加されます。Pag​​e.LoadControl( "path");

ページの読み込みと必要なすべてのコントロールがページにあります。私の問題は、ユーザーが[検索]ボタンをクリックするとイベントがトリガーされ、それらのコントロールへのユーザー入力に基づいてクエリが作成されることです。残念ながら、このメソッドはページ上のコントロールを見つけることができないため、適切なクエリを生成できません。

一時的なControlCollection変数を使用すると、ページ上のコントロールの数が4から10の範囲であるはずなのに、3であることがわかりました。コレクション内のこれらの3つのコントロールは、ページ上の静的ラベルとボタンです。

このソリューションはフレームワーク1.1で機能していたため、コードに問題があるのか​​、それともページサイクルの問題なのかはわかりません。ええ、私はこれがそうするのに最善のことではないことを知っています、しかし彼らはそれをこのようにしたので、私はそれを機能させなければなりません。

問題の原因が移行であるかどうかはわかりません。

どうもありがとう、デビッド!

4

2 に答える 2

1

ボタンをクリックすると、クリック ハンドラーが処理されている間、コントロールはサーバー側で使用できなくなります。サーバー側のページは、動的に作成したコントロールを認識しません。これは、ポストされた値をマップするためのサーバー側コントロールがないためです。値を見つけたい場合は、投稿されたコントロール データを調べる必要があり、サーバー側の asp.net コントロール階層に依存する必要はありません。

必要なすべてのデータを JavaScript を介して非表示フィールドに書き込み、非表示のデータ サーバー側を読み取ることもできます。これはポストされるためです。

以下が発生しています。

  1. コントロールを動的に作成する
  2. クリック時に制御データを投稿する
  3. ASP.NET は、認識している既存のコントロールにデータをマップします。
  4. コントロールが見つからないため、データは何にもマップされていません。

マッピングが発生する前に (PreInit で) コントロールを追加する必要があります。ページ ライフサイクルを確認すると、すべてのコントロールとデータがどのように結び付けられているかがわかります。

于 2011-03-24T21:25:18.293 に答える
0

ユーザーが検索をクリックしたときに、コントロールを新しいページに再度追加しますか?

覚えておいてください...ユーザーがそのページでサーバーにアクセスするたびに...新しいPageオブジェクトが作成されます。コントロールを動的に追加する場合は、ページが読み込まれるたびに追加する必要があります。

さらに、コントロールから値を取得したいように思われるため、必要に応じて、コントロールが毎回まったく同じIDプロパティで作成され、ビューステートが読み込まれる前に作成されることを確認する必要があります。それらの値を保持します。

于 2011-03-24T21:25:37.327 に答える