2011-08-15 73 views
0

几个星期前,我创建了一个模板化用户控件,大部分基于这里的例子: 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,同样也是第一次尝试动态填充/加载它,所以我确信我错过了完成此操作所需的一些东西。任何帮助是极大的赞赏。

- 安德鲁

回答

0

我认为,问题是你有没有实例要传递到您的模板预留位置的pH值。所以,它所抱怨的那一行是因为它不能将控件添加到PlaceHolder,因为它是空的/什么都不是。

此外,我相信你将需要把你的占位符的地方。否则,您将项目添加到永远不会添加到页面的容器中。

1

找到问题的解决方案,这是我如何加载TUC。

错误:

xpcRegion = new ExpandCollapseRegion(); 

正确:

xpcRegion = (ExpandCollapseRegion)LoadControl("ExpandCollapseRegion.ascx"); 

使这个简单的变化采取了照顾的问题。此外,我发现我可以通过使用CompiledTemplateBuilder()方法来放弃对自定义ITemplate类的需求。真的简化了代码。

- Andrew