动态加载用户控件

动态加载用户控件

第一步,在你的程序里添加一个用户控件,例如Login.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Login.ascx.cs" Inherits="Sample_ViewState.Controls.Login" %>

第二步,将你的Mater页或者Aspx页调整到设计视图,直接用鼠标将用户控件从右侧的解决方案资源管理器中拖到你的mater页或者Aspx页。在你的master或者Aspx页的源视图会自动生成两段段代码

第一段

<%@ Register src="Controls/Login.ascx" tagname="Login" tagprefix="uc1" %>

第二段

  <uc1:Login ID="Login1" runat="server" />

第三步,删除第二步中的第二段代码。在你的master页或者Aspx页你需要动态加载用户控件的地方添加一个div

 <div  id="tdpan" runat="server" 
        style="width:817px; height:200px; overflow:hidden; float:left">
     </div>

第四步,在你的mater页或者Aspx页的后台代码中,你需要动态加载用户控件的地方,写下如下代码,实现动态加载。比如我想在aspx页点击一个按钮来动态加载用户控件,我的代码是:

  protected void Button1_Click(object sender, EventArgs e)
        {
            UserControl myusercontrol = (UserControl)LoadControl("/Controls/Login.ascx");
            Type myusertype = myusercontrol.GetType();
            tdpan.Controls.Add(myusercontrol);
        }

Ok~

 

注意:动态加载用户控件,你会很奇怪的发现,在用户控件中的IsPostBack突然“不好使”了。比如在Page_Load方法里绑定所有数据,在用户控件里按某一个条件查询,你会发现,Page_Load在IsPostBack中重新绑定了你所有的数据,然后才按你的条件去在查询数据库在绑定。这简直无法忍受。

查询MSDN我们知道 userControl.IsPostBack  如果是正为响应客户端回发而加载用户控件,则为 true;若果是第一次加载或访问用户控件则为 false。
我们现在是动态加载,即正为响应客户端回发而加载用户控件,永远都是true。解决这个问题,需要我们动脑筋了,比如加一些变量来控制。

希望大家有更好的解决方法。

Master页,Aspx页,Ascx页的Page_Load的执行顺序:Aspx页-->Master页-->Ascx页。

你可能感兴趣的:(动态加载用户控件)