有关动态控件的问题
来源:互联网 发布:照片手机后期制作软件 编辑:程序博客网 时间:2024/05/02 07:14
动态控件的问题一定要注意页面加载的顺序
可以参考思归大哥的经典文章
要理解第一个问题,即,对于一个动态生成的DropDownList对象,为什么先添加ListItem,后调用父控件的Controls.Add,其状态并没有保存,其关键在于理解TrackViewState的调用以及动态控件加入父控件的Controls后的阶段“追赶”过程。
如果你在文档里查询Control的TrackViewState方法描述,其中说到,只有调用该方法后,view-state的变化才会存到服务器控件的StateBag对象里去,这样才会在下一次的PostBack后的LoadViewState中恢复到原来状态。
大家都知道每个控件一般都会经历如下几个阶段 (抄自《Developing Microsoft ASP.NET Server Controls and Components》 一书第九章)
1。Instantiate
2。Initialize
3。Begin Tracking View State
4。Load View State (postback only)
5。Load Postback Data (postback only)
6。Load
7。Raise Changed Events (postback only, optional)
8。Raise Postback Events (postback only, optional)
9。PreRender
10。SaveViewState
11。Render
12。Unload
13。Dispose
在页面里declared的服务器控件,譬如,例子中的ddlStatic,其TrackViewState方法是在Init阶段后面调用的,其后的变化将保存到StateBag里去,但其前的变化不会保存。如果你用Paul Wilson的ViewState Parser查看该例的ViewState,你是看不到其状态的。但假如在此之后,你改变其状态,那么这些状态也许就会保存到ViewState去(取决于该对象是否override了SaveViewState)。
那动态控件呢?其一开始是新建对象,处于原始状态,当它被加到父控件的Controls里时,父控件会根据其当前的control阶段来调用该子控件的一些方法,让子控件赶上父控件的control阶段 (这些方法可以从上个贴里leighsword和microhelper贴的Control的AddedControl方法里看到,在此就不重复了,而且也不用看那些方法)。为什么要这样呢?这应该跟整个页面的生命周期有关吧。
打个比方,不是很恰当,但凑合着吧,这好象是复制一个人后,让他快速经历婴儿,童年,少年,青年,。。。直至赶上被复制人目前的阶段为止。
但大概来讲,当我们在Page_Load里调用form1.Controls.Add()时,父控件form1处于Load阶段(上面的第六行),它就会调用下拉框的一些方法让它经过Init->Load状态,其中的一个结果是在Init后面调用了TrackViewState,DropDownList的父类ListControl, override了TrackViewState,在其中调用了Items(ListItemCollection类)对象的TrackViewState。其结果是,如果你在form1.Controls.Add()之后改变动态DropDownList控件的Items的话,那些ListItem就会被保存下来,因为ListItemCollection对象 override 了 SaveViewState() 。而在form1.Controls.Add()之前添加的ListItem则不会被保存下来。
其实解决TestDyn2.aspx中的问题有个现成的答案,即去除 if (!IsPostBack):
DropDownList ddlDynamic = new DropDownList();
ddlDynamic.ID = "ddlDynamic";
for (int i=1; i <=3; i++)
ddlDynamic.Items.Add(new ListItem(i.ToString(), i.ToString()));
form1.Controls.Add(ddlDynamic);
这样,跟ddlStatic一样,每次都生成ListItem对象
http://blog.joycode.com/saucer/archive/2004/10/21/36124.aspx
http://blog.joycode.com/saucer/archive/2004/10/20/35927.aspx
http://blog.joycode.com/saucer/archive/2004/10/26/36466.aspx
- 有关动态控件的问题
- 有关C++界面皮肤控件的问题!!
- 关于Data 控件的使用有关问题!
- [VB.NET]有关控件组的问题!
- 有关Repeater控件中选择的问题
- 有关动态联编的问题
- 动态控件的状态问题
- 请教vs.net中有关.ascx控件的显示问题
- 有关VB.net2005动态链SQL SERVER2000的问题
- 使用动态规划解决有关数字组合的问题
- SetLength设置动态数组长度的有关问题
- 动态控件的状态问题(2)
- 动态生成控件的显示问题
- ie下动态控件的诸多问题
- VB动态添加控件的问题
- Android控件动态设置style的问题
- C#解决动态添加控件时,控件闪烁的问题
- 动态加入控件问题
- 单元测试
- 现在mm不得了!
- AVI教程转成SWF
- MSDN比较有用的文章--创建动态数据输入用户界面(转载)
- CodeProtector v1.1
- 有关动态控件的问题
- 新年开门红 收到病毒邮件
- interface的多继承?
- 瑞星杀毒助手 升级到 0.1.0020版
- 显示Service Unavailable解决方法
- 鱼和水
- [讨论]没有钱,过年回不回家?
- 动态的加载控件
- 24岁女人和30岁男人的经典对白!