几个星期前,我创建了一个模板化用户控件,大部分基于这里的例子: http://msdn.microsoft.com/en-us/library/36574bf6(v=VS.90).aspx动态地将控件添加到模板用户控件?
不同的是,我并没有执行“MessageContainer”类,因为我想只是一个空模板我可以在设计时添加我想要的任何控件。
这TUC一直工作得很好,但我遇到了一个我没有预料到的情景,当我创建的东西。需要将此TUC动态添加到页面,这意味着我需要在TUC的模板中动态添加控件。
我发现了另一个例子在这里如何动态创建一个模板,并将其添加到模板化控件: http://msdn.microsoft.com/en-us/library/y0h809ak(v=vs.71).aspx
第二个例子本文仅讨论了“DataList的,直放站,和DataGrid控件”,但我想既然我在这里使用ITemplate接口,它应该是同样的事情。
但是,我无法得到这个工作,我不断收到“对象引用未设置为对象的实例。”当我尝试填充TUC时出错。
下面是我在做什么....
就像上面的例子中,我创建一个类的ITemplate:
public class XPCTemplate : ITemplate
{
private readonly Control _control;
public XPCTemplate(Control control)
{
_control = control;
}
public void InstantiateIn(Control container)
{
container.Controls.Add(_control);
}
}
然后,在测试页代码隐藏我尝试加载和显示职工大会动态:
ExpandCollapseRegion xpcRegion; // The Templated User Control
protected void Page_Load(object sender, EventArgs e)
{
PlaceHolder ph;
// .... code here to dynamically create some labels, textboxes, etc. ....
// Create an instance of the TUC
xpcRegion = new ExpandCollapseRegion();
// Pass into the TUC's template the controls dynamically created above
xpcRegion.LayoutTemplate = new XPCTemplate(ph);
// add the dynamic TUC to the page
phDynamicUC.Controls.Add(xpcRegion);
phDynamicUC.Controls.Add(new LiteralControl("<br />"));
}
测试页面HTML源代码:
<body>
<form id="form1" runat="server">
<div>
Dynamically Loading User Control
<br />
<asp:PlaceHolder ID="phDynamicUC" runat="server" />
</div>
</form>
</body>
当我运行该页面时,出现“container.Controls.Add(_control);”对象引用未设置为对象的实例“错误XPCTemplate类的一行。当我调试测试页面和TUC控件时,TUC的代码在TUC的Page_Init()方法中将XPCTemplate接收到它的LayoutTemplate中,但是当XPCTemplate中的InstantiateIn()事件立即触发时,“容器”参数是空值。
我不知道为什么会发生这种情况,它就像XPCTemplate类的InstantiateIn()方法试图在TUC中实际设置PlaceHolder控件而不是仅传递内容。也许这应该是这样的,我错过了TUC方面的一些东西来允许这种行为?
这是我创建的第一个TUC,同样也是第一次尝试动态填充/加载它,所以我确信我错过了完成此操作所需的一些东西。任何帮助是极大的赞赏。
- 安德鲁