在cs页面
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
cnblogs.ConDemo dy = new cnblogs.ConDemo();
dy.ID="dynamic1";
this.Controls.Add(dy);
cnblogs.ConDemo dy2=new cnblogs.ConDemo();
dy2.ID="dynamic2";
}
}
这些工作做完后,我们来分析分析现象。当我在第一次在浏览器浏览时:我们发现,子控件会在在预览的时候,可以发现阶段Condemo1(自定义控件)的执行顺序,当它被加到父控件的Controls里时,父控件会根据其当前的control阶段来调用该子控件的一些方法,让子控件赶上父控件的control阶段,
(图1)
每一个控件内部都保存着它当前的加载进度,也就是它到达了上述的哪一个阶段,当我们执行Control.Controls.Add方法来将一个控件添加到另一个控件中时,父控件就会检查子控件的加载进度,如果子控件的加载进度比自己的慢了,就会要求子控件追赶上来,
当我们点击“加载控件”按钮时,发现:
(两张图是一起的,截图的时候的不好截)
(图2)
蓝色代表,是动态添加的,红色是我们在页面上直接注册的。
但我们在button 事件还创建了一个自定义控件(dynamic2)实例,可我们没有把它添加到控件树上,所以说,除非控件添加到控件树上,否则它不将参于请求处理,当在页面上注册控件时,页面的解析器会把它加到控件树上,动态创建的控件,则要自已将控件添加到控件树上。
从上面图中,我们还可以看到,另一个信息,就是我们为什么动态添加的控件在回传后会消失,从图中,一眼就看出来了,按图2来说吧,因为当dynamic1动态加载到控件树上时,可这个控件树(这里指的是Page页面)已经完成了加载视图状态,从而在后来的恢复视图中找不到了dynamic1中的视图了。这样就解析了动态控件回传后为什么会消失的问题,经过分析,你可能已经知道了,我们点了“postback“按扭后,控件树,变成什么样了吧。
现在问题出现了,该如何解决呢?
介绍两种方法吧:
第一种,就是在OnInit事件中动态加载进去,
示例:
protected override void OnInit(EventArgs e)
{ cnblogs.ConDemo dy= new cnblogs.ConDemo();
dy.ID="dynamic1";
this.Controls.Add(dy);
dy.Visible = false;
base.OnInit(e);
}
然后在按扭事件中。查找dynamic1控件,将其Visible为true
第二种,见我的(动态添加控件终极解决方案)
地址:/news/2007-10/20071015164285770.shtml
二:下一讲事件机制,
原本想今天写事件机制一并写掉,可我没有准备好示例,所以,等下一讲讲吧。
先透露一下,大
家