zoukankan      html  css  js  c++  java
  • 找到了一个动态加载web用户自定义控件的问题,不知道算不算是微软的bug

    今天在动态加载(LoadControl)ascx时,发现了一个问题,搞了半天,才发现问题的所在,不知道算不算是微软设计中的一个bug。
    问题是这样的:webform上有一个placeholder,还有一个button,button的click事件是这样的

    private void Button1_Click(object sender, System.EventArgs e)
    {
        Control ctl = LoadControl("WebUserControl1.ascx");
        placeholder1.Controls.Add(ctl);
    }

    WebUserControl1.ascx上有一个label,然后WebUserControl1.ascx中的Page_Load事件是这样的

    private void Page_Load(object sender, System.EventArgs e)
    {
        if (!IsPostBack)
        {
            Label1.Text = "hello world!";
        }
    }

    看上去没什么问题,点击button后placeholder加载一个控件,这个控件给自己的一个label置一个初始值。但事实,并不是我们想上去的那样……
    程序运行后,点击button,自定义控件正常加载,但是label上并不是我们想要的"hello world!",而是默认的"label",为什么???

    经过研究,我发现了这个一个事实,这个自定义控件被加载时,其IsPostBack已经是true了(虽然它才第一次被加载),而不是我们想象中的false。
    我的想法本来是这样的,点击button时,主form上的ispostback是true,而自定义控件的是false,但事实并不是我们有时所想象的。

    所以,结论是,自定义控件中,在!IsPostBack 框框中来初始化值是不正确的(很多介绍asp.net的书籍中都在!IsPostBack中初始化值,但这仅对webform有效),会产生一些意想不到的后果。 所以,建议初始化工作可以放在oninit事件中。
  • 相关阅读:
    java Math类
    JAVA Date类与Calendar类【转】
    java Runtime类
    Java System类
    java 多线程
    java 包
    Java 内部类
    java 抽象类 以及模块方法设计模式,接口
    java 单例模式
    java 关于Java中静态代码块以及构造函数的执行先后顺序
  • 原文地址:https://www.cnblogs.com/oop/p/175504.html
Copyright © 2011-2022 走看看