8

ユーザー コントロールを PlaceHolder サーバー コントロールに動的に追加しています。私のユーザー コントロールは、いくつかのラベルといくつかのテキスト ボックス コントロールで構成されています。

フォームを送信し、サーバー上の (各ユーザー コントロール内の) テキスト ボックスの内容を表示しようとすると、それらは空です。

ポストバックが完了すると、ポストバック前に入力したデータがテキスト ボックスに表示されます。これは、ボックス内のテキストが ViewState を通じて保持されていることを示しています。デバッグ中になぜそれらが見つからないのかわかりません。

ユーザーがサーバーに入力したデータが表示されない理由を教えてください。

助けてくれてありがとう。

4

8 に答える 8

9

これは .NET v1 イベント シーケンスに基づいていますが、次のようなアイデアが得られるはずです。

  • 初期化 (初期化イベント)
  • トラッキング ビュー ステートの開始 (ポストバックかどうかを確認)
    • ビュー ステートの読み込み (ポストバックの場合)
    • ポストバック データのロード (ポストバックの場合)
  • Load(ロードイベント)
    • 変更されたイベントを発生させる (ポストバックの場合)
    • ポストバック イベントを発生させる (ポストバックの場合)
  • PreRender (PreRender イベント)
  • ビューステートを保存
  • 与える
  • Unload (アンロード イベント)
  • 廃棄

ご覧のとおり、ViewState データのコントロールへの読み込みは、Load イベントの前に行われます。したがって、動的に追加されたコントロールがこれらの値を「保持」するためには、ASP.NET ページが最初に値を再読み込みできるようにする必要があります。Load View State が発生する前に、Init ステージでこれらのコントロールを再作成する必要があります。

于 2008-09-19T15:07:26.357 に答える
3

昨日、loadviewstateevent が発生した直後にコントロール ツリーを読み込むことで、実際にアプリを通常どおりに動作させることができることがわかりました。loadviewstate イベントをオーバーライドし、mybase.loadviewstate を呼び出してから、その直後にコントロールを再生成する独自のコードを配置すると、それらのコントロールの値がページの読み込み時に利用可能になります。私のアプリの 1 つで、viewstate フィールドを使用して、これらのコントロールを再作成するために使用できる ID または配列情報を保持しています。

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub
于 2009-07-16T13:19:13.893 に答える
2

これらの値を読み取るために、Load フェーズによって ViewState が入力されるようにするには、ページ ライフ サイクルの Init フェーズで UserControl を PlaceHolder に追加する必要があると思います。これはあなたがそれらをロードしている順序ですか?

于 2008-09-19T14:56:18.257 に答える
1

動的コントロールをクラス レベルで定義し、ASP コンテナーに追加していることを確認します。

Private dynControl As ASP.MyNamespace_MyControl_ascx

コントロールをインスタンス化するときは、LoadControl を呼び出して、オブジェクトが適切に追加されるようにします。

dynControl = CType(LoadControl("~/MyNamespace/MyControl/MyControl.ascx"), ASP.MyNamespace_MyControl_ascx)
于 2008-09-19T15:08:13.220 に答える
0

私たちは同じことを経験し、まったく同じ .ID を持つ page_load のゴースト コントロールを使用して処理し、ポスト バックがイベントとデータを取得します。他の人が言ったように、状態が既に構築され、後に追加されたコントロールが保存されないのは、初期化段階の後のコントロールの動的な追加です。

これが少し役立つことを願っています。

于 2008-09-19T15:14:04.110 に答える
0

他の人が言ったように、ビューステートを作成する前に、あらゆる形式のコントロール操作を行う必要があります。

ページのライフサイクルに関する役立つリンクを次に示します。

http://msdn.microsoft.com/en-us/library/ms178472.aspx

于 2008-09-19T15:01:15.640 に答える
0

Page_PreInit イベント ハンドラーでコントロールを作成する必要があります。ASP.NET サーバー コントロール モデルは扱いにくいものです。それを正しく行うには、ページのライフサイクルを完全に理解する必要があります。

于 2008-09-19T14:58:40.560 に答える
0

また、実行時に Control.ID プロパティを設定するだけで、ユーザー コントロールが期待どおりに動作することを確認したことも付け加えておきます。ID を設定しないと、アイテムが別の順序で作成され、おかしな動作をする可能性があります。

于 2009-05-04T21:54:09.727 に答える