我同意这里提出的其他观点“如果您可以摆脱动态创建控件,那么就这样做......”(@ Jesper Blad Jenson aka)但这是我过去使用动态创建的控件制定的一个技巧。
问题变成了先有鸡还是先有蛋。您需要您的 ViewState 来创建控件树,并且您需要创建您的控件树来获取您的 ViewState。嗯,这几乎是正确的。有一种方法可以在填充树的其余部分之前获取您的 ViewState 值。那是通过覆盖LoadViewState(...)
and SaveViewState(...)
。
在 SaveViewState 中存储您要创建的控件:
protected override object SaveViewState()
{
object[] myState = new object[2];
myState[0] = base.SaveViewState();
myState[1] = controlPickerDropDown.SelectedValue;
return myState
}
当框架调用您的“LoadViewState”覆盖时,您将取回您从“SaveViewState”返回的确切对象:
protected override void LoadViewState(object savedState)
{
object[] myState = (object[])savedState;
// Here is the trick, use the value you saved here to create your control tree.
CreateControlBasedOnDropDownValue(myState[1]);
// Call the base method to ensure everything works correctly.
base.LoadViewState(myState[0]);
}
我已经成功地使用它来创建 ASP.Net 页面,其中 DataSet 被序列化到 ViewState 以存储对整个数据网格的更改,从而允许用户使用 PostBacks 进行多次编辑并最终在单个“保存”中提交所有更改手术。