转自:http://hi.baidu.com/trip008/blog/item/d6139ab77b5414f130add1e9.html
protected override void OnPreRender(EventArgs e)
protected override void Render(HtmlTextWriter writer)
这两个的区别。可否告知
====================================================
asp.net页面在触发各个子控件的事件之后,会递归调用控件的OnpreRender,然后(注意)递归地将控件的ViewState序列化成一个字符串,最后递归调用控件的Render输出结果(在最高层控件即page控件的Render就会把那个ViewState序列化字符串写到输出的html的隐藏字段中)。
因此,在Render中创建、改变的内容即使写入ViewState,其实也无法在页面回发之后被恢复,叶面回发之后回填的ViewState仍然是OnPreder或者之前的时候得值。
因此通常,控件的OnPrerender用来最控件的最后最后一次改变(动态生成),而在Render中仅仅用来输出html而并不改变控件自身。
另外,控件在vs设计器中的时候,并不是page对象驱动页面显示的。虽然在设计其上看上去很像asp.net应用程序处理页面的结果。起码,设计器并不调用OnPrerender,而是根据Designer标签中说明的方法来调用显示逻辑。这样你就可以让控件在设计器中表现为与运行时不同的结果。例如表格控件在设计器中就不显示所有绑定数据,而是显示自己创建的一组示例数据,以便让你有一个简洁的方式设计界面布局,同时也让连接数据库等等只有在运行时才需要的费时、可能失败的行为在设计时避免执行。
这里我想到一个常见现象。很多人已经会写自定义控件了。但是其实只了解运行时的控制机制,写出的自定义控件并不支持vs设计器的控制机制。例如这个OnPreRender在设计时并不被调用是很多人不知道的。精通编写自定义控件的人,也许仅仅让其以程序代码的方式被使用,其编写的自定义控件使用在RAD方式的时候并不好用,这是常见的。