动态加载用户控件的一点心得
1.功能目标:
a.在下拉列表中选择项,加载相应用户控件。
b.试验动态加载用户控件。
2.布局:
页面中一个DropDownList(ddlType)
一个PlaceHolder(ph)
3.代码:
private string MyUCType
{
get
{
if(ViewState["MyUCType"] != null)
{
return ViewState["MyUCType"].ToString();
}
else
{
return "补录设备";
}
}
set
{
ViewState["MyUCType"] = value;
}
}
{
get
{
if(ViewState["MyUCType"] != null)
{
return ViewState["MyUCType"].ToString();
}
else
{
return "补录设备";
}
}
set
{
ViewState["MyUCType"] = value;
}
}
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
AddUC();
}
private void ddlType_SelectedIndexChanged(object sender, System.EventArgs e)
{
MyUCType = ddlType.SelectedValue;
AddUC();
}
private void AddUC()
{
if(ph.FindControl("uc1") != null)
{
ph.Controls.Remove(ph.FindControl("uc1"));
}
if(MyUCType == "补录设备")
{
UserControl.TemplateAddDevice uc = (UserControl.TemplateAddDevice)LoadControl("../UserControl/TemplateAddDevice.ascx");
uc.ID = "uc1";
ph.Controls.Add(uc);
}
else if(MyUCType == "硬件升级")
{
UserControl.TemplateHardwareUpgrade uc = (UserControl.TemplateHardwareUpgrade)LoadControl("../UserControl/TemplateHardwareUpgrade.ascx");
uc.ID = "uc1";
ph.Controls.Add(uc);
}
}
{
if(ph.FindControl("uc1") != null)
{
ph.Controls.Remove(ph.FindControl("uc1"));
}
if(MyUCType == "补录设备")
{
UserControl.TemplateAddDevice uc = (UserControl.TemplateAddDevice)LoadControl("../UserControl/TemplateAddDevice.ascx");
uc.ID = "uc1";
ph.Controls.Add(uc);
}
else if(MyUCType == "硬件升级")
{
UserControl.TemplateHardwareUpgrade uc = (UserControl.TemplateHardwareUpgrade)LoadControl("../UserControl/TemplateHardwareUpgrade.ascx");
uc.ID = "uc1";
ph.Controls.Add(uc);
}
}
4.要注意:
a.如果在PostBack后不调用AddUC()加载用户控件的话,当你点击用户控件里的按钮(或者其它引起回传的操作)之后,用户控件在页面中就会消失。
b.通过这种方式加载的用户控件会引起的问题:
如果你在 用户控件里的Page_Load里写了代码的话,除了页面Load里加载的第一个用户控件会执行外,你之后选择的用户控件将不会执行其自身的Page_Load里的代码。这一点一定要注意。
解决办法:将本来写在用户控件里的Page_Load里的代码写到一个公用方法里面,然后在加载用户控件的时候调用该方法。
不知道还有其它方法不?
请各位指教。