什么时候使用PreRender而不是PageLoad?

时间:2011-09-12 09:37:53

标签: c# .net asp.net drop-down-menu

相关问题:Get All Web Controls of a Specific Type on a Page

在上面的问题中,我问我如何能够获得所有控制,像魅力一样,但是有些东西不太合适,所以我认为它可能是我。我有以下代码,但它不是在操纵页面上的控件,但在我的理论中它应该可以工作。

List<DropDownList> allControls = new List<DropDownList>();
ControlEnhancer.GetControlList<DropDownList>(Page.Controls, allControls);

foreach (DropDownList childControl in allControls)
        {
            foreach (ListItem li in childControl.Items)
            {
                li.Attributes.Add("title", li.Text);
            }

            childControl.Attributes.Add("onmouseover", "this.title=this.options[this.selectedIndex].title");
        }

这是代码,GetControlList()代码,你可以从相关的问题中获得,它显示了它如何获得所有控件,它只是我的操作。我正在尝试获取所有下拉列表列表项并为它们添加标题,以便我可以获得工具提示。

这是IE8的快速解决方案,下面是下拉框中的长文本缩减。

2 个答案:

答案 0 :(得分:9)

Page_Load经常发生得太快; Page_PreRender是实际为浏览器呈现页面HTML之前的最后一刻,在许多情况下是在用户控件上设置属性的最佳位置。

这是因为在Web表单(页面)生命周期中,页面中有其他事件(以及页面中包含的用户控件...),有时删除/替换/覆盖真的)这些属性因此将这些属性提供给浏览器的唯一方法是在Page_PreRender.

中触发并处理所有其他生命周期事件后追加它们

答案 1 :(得分:9)

实际上,在某些情况下,即使PreRender也可能过早(例如,在使用DropDownList的控件进行数据绑定期间,您可能会在控件树中添加DataSourceID个控件。

还有两个可能更合适的事件:

  • PreRenderComplete。此时,将创建所有控件并准备好呈现页面。

  • SaveStateComplete。保存视图状态和控制状态后发生。您在此处所做的任何更改都不会保留以查看状态。

在您的示例中(添加客户端属性),我将使用SaveStateComplete事件来避免不必要的视图状态膨胀。