动态加载用户控件
第一步,在你的程序里添加一个用户控件,例如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页。