コントロール ツリーは、部分的なポストバックを含むすべてのポストバックで再構築する必要があります。または、ControlState/ViewState を介して再構築します。この場合、以降のポストバックでは、Items コレクションは再構築されず (またはクリアされず)、Render フェーズで空になります。
このような場合、私は次のようにアプローチします。
- RadioButtonList で ViewState を有効にし、それが Load 1までに追加されていることを確認します。または;
- コンテナー コントロールに適切なコレクションの ViewState を格納し、次に消費するコントロールを DataBind します。これを設定するクリーンな方法については、GenericDataSourceControlを参照してください。一貫性があり、予測可能で、制御しやすいため、私はこのアプローチを好みます。
1これは機能するはずですが、機能しない場合があります。私は通常、どのコントロールが ViewState を実際にサポートしているか、また、その使用法が常に矛盾していると思うので、どの程度まで混乱しています。いずれにせよ、ViewState が無効になっていると機能しません。ページ (または親コントロール) の ViewState を無効にすると、ViewState が完全に無効になることに注意してください。また、コントロールは、適切なタイミングで同じコントロール パス/ID (通常は Init または Load) を使用してコントロール ツリーに読み込まれ、ViewState 要求で正しく機能する必要があります。
#2の大まかなアイデア:
含まれているユーザー コントロールにビュー ステートを保存します (このコントロールに対して ViewState を有効にする必要があります)。
// ListItem is appropriately serializable and works well for
// automatic binding to various list controls.
List<ListItem> Names {
// May return null
get { return (List<ListItem>)ViewState["names"]; }
set { ViewState["names"] = value; }
}
GenericDataSourceControl (適切な ID を持つように GDS をマークアップに入れます) で、イベントを選択します。
void SelectEvent(sender e, GenericSelectArgs args) {
args.SetData(Names);
}
RadioButtonList を動的に追加します (たとえば、 でControl.OnLoad
)。
// Unless this NEEDS to be dynamic, move it into the declarative markup.
// The dynamic control must be added to the *same location* it was before the
// postback or there will be ugly invalid control tree creation exceptions.
var radioList = new RadioButtonList();
someControl.Controls.Add(radioList);
// To minimize problem with Control Tree creation this should be unique and
// consistent for dynamic controls.
radioList.ID = "radioList";
// Binding to the DS "declarative" usually works better I've found
radioList.DataSourceID = "idOfTheGDS";
// You -may- need to DataBind, depending upon a few factors - I will usually call
// DataBind in PreRender, but generally in the Load is OK/preferred.
// If it already binds, don't call it manually.
radioList.DataBind();
DataBinding が正しく機能している場合は、RadioButtonList の ViewState を無効にできるはずですが、ControlState が使用されるべきときに ViewState が使用されることがあるので、必要に応じて機能することを確認してください。