Board logo

标题: 关于窗体页事件顺序测试的问题 [打印本页]

作者: bool_sir    时间: 2011-9-6 21:04     标题: 关于窗体页事件顺序测试的问题

------------------------测试窗体页事件顺序,代码如下-------------------------

protected void Page_PreInit(object sender,EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_PreInit";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页初始化
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Init(object sender,EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_Init";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页初始化完成
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_InitComplete(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_InitComplete";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页预加载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_PreLoad(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_PreLoad";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页加载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_Load";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页加载完成
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_LoadComplete(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_LoadComplete";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页渲染前
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_PreRender(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_PreRender";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    ///窗体页保存视图状态
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_SaveStateComplete(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_SaveStateComplete";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页渲染
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Render(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_Render";
        Response.Write(s);
        Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }
    /// <summary>
    /// 窗体页卸载
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Unload(object sender, EventArgs e)
    {
        string s = DateTime.Now.ToLongTimeString();
        s += "事件名称为Page_Unload";
        ApplicationInstance.Response.Write(s);
        ApplicationInstance.Response.Write("<br />");
        System.Threading.Thread.Sleep(1000);
    }

------------------------输出结果如下-------------------------
20:56:29事件名称为Page_PreInit
20:56:30事件名称为Page_Init
20:56:31事件名称为Page_InitComplete
20:56:32事件名称为Page_PreLoad
20:56:33事件名称为Page_Load
20:56:34事件名称为Page_LoadComplete
20:56:35事件名称为Page_PreRender
20:56:36事件名称为Page_SaveStateComplete


20:56:37事件名称为Page_Unload
注意上面空一行,为Page_Render事件没有显示。请问为什么?
作者: books2009    时间: 2011-9-7 10:55

你好,严格来说Render不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。

这是MSDN中的描述,虽然他有事件特征,也是这个时候来执行,但页面中的这个事件内容不会执行
作者: books2009    时间: 2011-9-7 10:55

你这种求证精神很好
作者: bool_sir    时间: 2011-9-7 19:34

谢谢老师指点 还是有点没听明白 。“不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。

”这一段不明白
作者: books2009    时间: 2011-9-8 10:18

你好  要了解你红色标记的这句话,就一定要对自定义控件有深入了解,如自定义控件完全是你自己定义的,还是你继承了某个服务器控件来拓展定义的。。。完全自己定义的话,就需要Render,这样才能输出标记到浏览器,如果是继承某个服务器控件的,如你继承了TextBox,想做一个新的属于自己的文本框,那就不一定要Render了,只做你需要修订的地方好了。
作者: bool_sir    时间: 2012-2-12 14:56

谢谢老师的解答,依然坚持在看《ASP.NET从入门到实践》,不得不说,这是一本很适合新手学习的书。现在在看实例章节了,比这个问题提问的时候,又有多了新的认知,感谢您一直以来不厌其烦对我的帮助,谢谢。
作者: wfyyf    时间: 2012-3-17 10:39

必须有个老师 没有老师感觉学不会啊




欢迎光临 万卷图书 (http://wanjuanchina.net/) Powered by Discuz! 7.0.0