我的工程是这样的:
有一个主页面:default.aspx,里面放置一个placeholder,这个placeholder加载了个“静态”的main.ascx用户控件。main.ascx由两个placeholder组成,这两个placeholder,一个用来“静态”加载login.ascx,另一个用来“动态”加载info.ascx用户控件
我想要实现的功能是,当在login.ascx里输入正确的用户名和密码并点击登录按钮后,info.ascx通过LoadControl和Controls.Add方法被动态加载,另外,info.ascx的Page_Load()事件里有一些查询,查询出最近的新闻并存放于该info.ascx的控件gird中,照理说,当我在点击login.ascx的登录按钮后,main.ascx的placeholder动态加载了info.ascx用户控件, 接着info.ascx执行Page_Load(),于是查询出最近的通知,并显示在main.ascx的placeholder中。但结果却是:当点击login.ascx的登录按钮后,info.ascx页面能够显示,但它的grid里并没有数据记录,进一步的测试后我发现,虽然info.ascx在login.ascx的按钮单击事件后能够被动态加载到main.ascx的placeholder并显示出来,但是在这个过程中,info.ascx的Page_Load事件没有被执行!!(我在Page_Load()里写了Response.Write("OK");以及用session传递字符串作为标志等,结果都没显示出来)我在login.ascx里按钮单击事件里用session保存了用户控件,在main.ascx里加载这个控件不知道说清楚了没有,请各位帮忙
急,谢了

解决方案 »

  1.   

    有一点说错了,上面那个login.ascx是直接加载在页面的,没有用placeholder
      

  2.   

    我在login.ascx里按钮单击事件里用session保存了用户控件,在main.ascx里加载这个控件是你的info.ascx么?为什么要用session? 在你login成功后直接加入到main中不行么?
      

  3.   

    你确认把你LoadControl的控件加到PlaceHolder的Controls里去了么?Control c = LoadControl("info.ascx");
       c.ID = "xxx";
       ph.Controls.Add(c);下面是参考编码
    1.default.aspx:
    <%@ Register TagPrefix="cc" TagName="Main" src="main.ascx" %>
    Main page:
    <form runat="server">
    <asp:PlaceHolder id="ph" runat="server">
    <cc:Main id="main1" runat="server" />
    </asp:PlaceHolder><asp:Button id="btnRefresh" runat="server" Text="Refresh" />
    </form>2. main.ascx:
    <%@ Register TagPrefix="cc" TagName="Login" src="login.ascx" %><cc:Login id="Login1" runat="server" OnLogin="DoLogin"/><asp:PlaceHolder id="ph" runat="server">
    </asp:PlaceHolder><script language="C#" runat="server">
    public bool InfoLoaded
    {
      get
      {
        object o = ViewState["InfoLoaded"];
    if (o==null)
    return false;
    else
    return (bool)o;
      }  set
      {
      ViewState["InfoLoaded"] = value;
      }
    }void Page_Load(Object sender, EventArgs e)
    {
    if (InfoLoaded)
    LoadInfo();
    }void LoadInfo()
    {
       Control c = LoadControl("info.ascx");
       c.ID = "xxx";
       ph.Controls.Add(c);
    }void DoLogin(Object sender, EventArgs e)
    {
       LoadInfo();
       InfoLoaded = true;
    }
    </script>
    3. login.ascx:
    <script language="C#" runat="server">
    public event EventHandler Login;void DoLogin(Object sender, EventArgs e)
    {
    if (Login!=null)
    Login(sender,e);
    }
    </script>
    <asp:Button id="btn" runat="server" Text="Login" OnClick="DoLogin" />4. info.ascx:
    info.ascx:
    <script language="C#" runat="server">
    void Page_Load(Object sender, EventArgs e)
    {
    Response.Write("Page_Load in Info.ascx");
    }
    </script>