日期:2014-05-18  浏览次数:20397 次

动态加载用户控件
用户控件FriendsFooter.ascx头部描述如下:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="FriendsFooter.ascx.cs" Inherits="FriendReunion.FriendsFooter" %>

FriendsFooter.ascx.cs描述如下:
namespace FriendReunion
{
  public partial class FriendsFooter : System.Web.UI.UserControl
  {
  protected void Page_Load(object sender, EventArgs e)
  {

  }
  } 
}


现在要在一个FriendsBase.cs文档中动态加载该用户控件
namespace FriendReunion
{

  public class FriendsBase : System.Web.UI.Page
  {
  protected override void Render(HtmlTextWriter writer)
  {

  Control form = Page.Controls[1];

   
  FriendsFooter footer; //这里的FriendsFooter类找不到定义???如何解决?
  footer = (FriendsFooter)(Page.LoadControl(Request.ApplicationPath + "/" + "Controls/FriendsFooter.ascx"));
   
  form.Controls.AddAt(Page.Controls[1].Controls.Count, footer);

  base.Render(writer);
  }
  }
}
出现:CS0246: 找不到类型或命名空间名称“FriendsFooter”(是否缺少 using 指令或程序集引用?)
如果把FriendsFooter改成Control能正常显示,但失去了FriendsFooter中定义的功能,如何正确引入该类,才能转换呀?


------解决方案--------------------
微软示例:
就像您可以通过编程方式在 Web 窗体页上创建任意 ASP.NET 服务器控件的实例,您也可以通过使用包含页的 LoadControl 方法来做到这一点。但您首先必须使用@ Control 指令的 className 属性将强类型与用户控件相关联。之所以需要这样是因为 LoadControl 方法返回 Control 类的类型,并且您需要将该用户控件转换为合适的强类型,以便设置该控件的各个属性。
以下代码使用 className 属性将 MyUserControl.ascx 文件中保存的用户控件转换为强类型。
<%@ Control className="MyUserControl" %>
以编程方式创建用户控件的实例 
使用@ Reference 指令在要包含用户控件的 Web 窗体页的顶部注册该用户控件。当以编程方式创建用户控件时,只有您创建了对该控件的引用后,用户控件的强类型才可用于该 Web 窗体页。例如,以下代码创建对 MyUserControl.ascx 文件中所创建用户控件的引用。 
<%@ Reference Control="MyUserControl.ascx" %>注意 当以声明方式在 Web 窗体页中创建用户控件的实例时,请使用@ Register 指令。
在代码隐藏类文件中,或是在包含 .aspx 文件的代码声明块中,创建用户控件的实例。根据需要分配属性值,并使用 Add 方法将该控件添加到包含页的 ControlCollection 对象上。这使该控件可用于该页的继承的 Control.Controls 属性。在以下示例中,创建 MyUserControl.ascx 的实例并将其 BackColor 属性设置为 beige。 
[C#]Control c1 = LoadControl("MyUserControl.ascx");((MyUserControl)c1).BackColor = "beige";Page.Controls.Add(c1);[Visual Basic]Dim c1 As UserControl = LoadControl("MyUserControl.ascx")CType(c1, MyUserControl).BackColor = "beige"Page.Controls.Add(c1)注意 当您使用 Add 方法将控件添加到 ControlCollection 对象时,这些控件将按处理顺序放置在集合中。如果您希望将控件添加到集合中的特定位置,请使用 AddAt 方法并指定您要存储该控件的索引位置。


地址:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconinstantiatingusercontrolsprogrammatically.htm

鸿雪示例:
注: 本方法是我同事李强原创

步骤一: 把ascx控件拖入设计窗口,然后转入html模式,保留定义
如果你需要多个ascx的话,请全部拖入。
但是把相应的内容删除。(因为我们需要动态加载)
在需要填入控件的地方,放个容器,比如td,并设定在服务器端运行

<TD id="tdpan" runat=server></TD>

2:动态调用
UserControl myusercontrol = (UserControl) LoadControl ("../includes/pageNavigater.ascx") ; 
Type myusertype = myusercontrol.GetType();
//下面是给ascx赋值
PropertyInfo myuserinfo1 = myusertype.GetProperty("RelatedDatagrid");//) .GetProperty("RelatedDatagrid");
myuserinfo1.SetValue(myusercontrol,gridhwcy ,null);


PropertyInfo mypassinfo = myusertype.GetProperty("torefresh");
mypassinfo.SetValue(myusercontrol,true,null );

PropertyInfo myuserdatasource = myusertype.GetProperty("RelatedDataSource");
myuserdatasource.SetValue(my