陷阱之一是,如果控件不包含在其中<form>
,它将不存在。我建议继续并在事件处理程序阶段添加它们 - 因为那时您知道要添加什么 - 但将必要的信息存储在ViewState
或中重建这些控件SessionState
。
通过这样做,您将能够在 中重新创建它们OnInit
,但不必处理您现在要走的道路周围的一些其他复杂性。
因此,假设您发现需要构建一个控件。你会构建它:
var tb = new TextBox();
tb.ID = "myTextBox";
...
但您还需要保存必要的状态信息:
this.ViewState.StoreControl(typeof(TextBox), "myTextBox");
然后只需构建扩展方法:
public static void StoreControl(this StateBag vs, Type controlType, string name)
{
var dynamicControls = vs["DynamicControls"] as List<Tuple<Type, string>>;
if (dynamicControls == null)
{
dynamicControls = new List<Tuple<Type, string>>();
vs["DynamicControls"] = dynamicControls;
}
var t = dynamicControls.FirstOrDefault(tp => tp.Item2 == name);
if (t == null) { dynamicControls.Add(Tuple.Create(controlType, name)); }
}
那么OnInit
你可能会做这样的事情:
var dynamicControls = vs["DynamicControls"] as List<Tuple<Type, string>>;
if (dynamicControls != null)
{
foreach (var tp in dynamicControls)
{
Control c = Activator.CreateInstance(tp.Item1) as Control;
c.ID = tp.Item2;
this.Controls.Add(c);
}
}
注意:此代码是在 SO 上编写的。它没有被编译或调试。但你明白了。