11

ドロップダウン リストで選択した値に基づいて適切なユーザー コントロールを表示する Web ページを作成しようとしています。

基本的に、ページ レイアウトは次のとおりです。

ドロップ ダウン選択
<ドロップ ダウン選択 に基づいて作成されたユーザー コントロール >

半分は機能しています...選択が変更されると、コントロールが変更されます。OnInit() では、最後に選択されたコントロールを動的に作成します (OnInit では ViewState を使用できないため、その値はセッション状態に保存されます)。

ドロップダウン選択の変更が発生すると、古いユーザー コントロールを削除し、新しいユーザー コントロールを追加します。 問題は、選択変更イベントから新しいコントロールが追加されているため、最初のポストバックでユーザーからの変更を保存できないことです。最初のポストバックの後、選択されたコントロールは Change イベントではなく OnInit から作成され、状態はそれ以降、次の選択変更まで保存されます。

以下は SelectionChanged メソッドです。

protected void SelectionChanged(object sender, EventArgs e)
{
    SelectedValue = int.Parse(DropDownList.SelectedValue);  //Store in Session
    Control userControl = GetSpecificUserControl(SelectedValue);
    PlaceHolder1.Controls.Clear();   // Remove old user control
    PlaceHolder1.Controls.Add(userControl);
}

SelectionChanged が発生した後にユーザーが新しいコントロールに加えた変更は、次のポストバックには保存されません。ただし、後続のポストバックは保存されます。その時点で、コントロールは OnInit() で作成されます。

コントロールが変更されたときに正しいポストバックと ViewState を強制する方法はありますか? コントロールが変更された後にページの再初期化を強制することは可能ですか?

4

4 に答える 4

11

あなたがする必要があるのは、セッションでDropDownListの最後の既知の値を保持することです。それで:

OnInit:

  • セッションに保存された値によって示されるコントロールを作成します

SelectionChangedイベント

  • OnInit中に作成したものをすべて削除します
  • 新しいDropDownListの選択に基づいて、新しいコントロールを作成して追加します
  • セッションで新しいDropDownList選択を保存します

このように、変更後の次のポストバックで、ViewStateが検出することを期待していたコントロールを再作成しているため、その状態が復元されます。

動的制御は非常に厄介な場合があります。多くの場合、必要になる可能性のあるすべてのコントロールを作成し、それらのVisibleプロパティをfalseに設定する方が簡単です。このように、それらはブラウザにまったくレンダリングされません。次に、必要なときに必要なコントロールだけをVisibleにtrueに設定します。

于 2009-06-12T16:44:01.927 に答える
6

これは、ASP.NetWebフォームでの典型的なヘアアウトの問題です。いくつかのオプションがあります。

1)これは、意図したページのライフサイクルから少し外れるため、少しハックですが、私の経験では、問題に対処する最も直接的な方法です。ページがドロップダウン選択イベントからポストバックするときRequest["MyDropDownID"]は、ドロップダウンコントロールの選択された値をポーリングするだけです。イベントがページを設定するのをInit()待たないでOnMyDropDownChanged()ください。

2)ユーザーコントロールに独自のViewState処理を実装します。これには、ViewStateのドキュメントを掘り下げて、いくつかのメソッドをオーバーライドする必要があります。

3)ジョエルの解決策。彼は私を殴りましたが、私は最初の投稿を取得しようとしていました:p

他のオプションには、javascriptなどを使用して値を投稿することが含まれますが、それらは非常に面倒になります。

于 2009-06-12T16:44:31.490 に答える
-4

コントロールを SelectedIndexChanged ハンドラーに追加しないでください。Page_Load 中に追加してください。ページがロードされるたびにドロップダウンの値をテストし、その値の正しいコントロールをロードするだけです。

于 2009-06-12T16:41:33.383 に答える