周末,欢送同学,说到一句话:如果一直做软件的话,就写一本书how to be a professional programmer——职业程序员入门指南,教育一下俺这样的半吊子。
最近发现动态添加控件时,需要先将新控件添加到控件集合中,然后再设置新控件的属性.
比如
private void Button1_Click(object sender, System.EventArgs e)
{ {
Placeholder1.Controls.Clear();
DropDownList d = new DropDownList();
d.ID="controlID";
Placeholder1.Controls.Add
;
d.Width=200;
MyDataHelper.BindControl(d, CityList.GetType() );
ViewState["AddControl"] = true;
}
MyDataHelper.BindControl是一个绑定数据的函数
然后,在pageload里,重新载入该控件
private void Page_Load(object sender, System.EventArgs e)
{
if ((ViewState["AddControl"]!= null) && ((bool)ViewState["AddControl"]))
{
DropDownList d = new DropDownList();
d.ID="controlID";
Placeholder1.Controls.Add
;
}
}
这样的代码可以正常工作,postback之后ddl的属性和绑定的数据不会丢失。
但是,如果把代码的顺序颠倒一下
....
// it does not work
d.Width=200;
MyDataHelper.BindControl(d, CityList.GetType() );
Placeholder1.Controls.Add
;
....
postback之后,postback之后ddl的属性和绑定的数据丢失。
打印 | 张贴于 2003-12-22 16:24:00 | Tag:Dot Net

留言反馈
ylhyh@msn.com
具体原因我还得学习一下ASP.NET的具体实现,现在还真说不准。不过记得在哪儿看过这样一个best practice,所以一直遵照着做,也没出过类似的错就是了。话大意是这么说的:在运行时动态创建控件后,应尽快将其加入控件层次中(也就是尽快用parent.Controls.Add将其加入指定的容器中),在这个过程中,新的控件将获得正确的UniqueID等关键信息。
也许你可以让我看一下MyDataHelper.BindControl方法的代码会对定位问题有所帮助。而且在搞清原因之前,先遵照最佳实践肯定是没错的。:)
Controls.Add高脚杯