[英]Dynamically adding controls to a Templated User Control?
幾周前,我創建了一個模板化用戶控件,大部分基於此處的示例: http://msdn.microsoft.com/en-us/library/36574bf6(v=VS.90).aspx
不同之處在於我沒有實現“MessageContainer”class,因為我只想要一個空模板,我可以在設計時添加我想要的任何控件。
這個 TUC 一直運行良好,但我遇到了一個我在創建這個東西時沒有預料到的場景。 需要將此 TUC 動態添加到頁面,這意味着我還需要在 TUC 的模板中動態添加控件。
我在這里找到了另一個關於如何動態創建模板並將其添加到模板控件的示例:http://msdn.microsoft.com/en-us/library/y0h809ak(v=vs.71).aspx
這第二篇示例文章僅討論了“DataList、Repeater 和 DataGrid 控件”,但我認為由於我在這里使用的是 ITemplate 接口,因此應該是相同的。
但是,我無法讓它工作,我不斷收到“對象引用未設置為 object 的實例”。 當我嘗試填充 TUC 時出錯。
這就是我正在做的事情......
像上面的例子一樣,我創建了一個 ITemplate class:
public class XPCTemplate : ITemplate
{
private readonly Control _control;
public XPCTemplate(Control control)
{
_control = control;
}
public void InstantiateIn(Control container)
{
container.Controls.Add(_control);
}
}
然后,在測試頁面代碼隱藏中,我嘗試動態加載和顯示 TUC:
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 class 的行。 當我調試測試頁面和 TUC 控件時,TUC 的代碼在 TUC 的 Page_Init() 方法期間將 XPCTemplate 接收到其 LayoutTemplate 中,但是當 XPCTemplate 中的 InstantiateIn() 事件隨后立即觸發時,“容器”參數是NULL。
我不確定為什么會發生這種情況,就像 XPCTemplate class 的 InstantiateIn() 方法試圖在 TUC 中實際設置 PlaceHolder 控件,而不僅僅是傳遞內容。 也許這應該是這種方式,而我在 TUC 方面遺漏了一些東西來允許這種行為?
這是我創建的第一個 TUC,也是第一次嘗試動態填充/加載它,所以我確信我缺少完成此操作所需的一些東西。 任何幫助是極大的贊賞。
- 安德魯
找到了問題的解決方案,這就是我加載 TUC 的方式。
不正確:
xpcRegion = new ExpandCollapseRegion();
正確的:
xpcRegion = (ExpandCollapseRegion)LoadControl("ExpandCollapseRegion.ascx");
做出這個簡單的改變就解決了這個問題。 此外,發現我可以通過使用CompiledTemplateBuilder()
方法放棄對自定義ITemplate
class 的需求。 真正簡化了代碼。
- 安德魯
我相信問題在於您沒有實例化您傳遞到模板中的 PlaceHolder ph。 因此,它抱怨的那一行是因為它無法將控件添加到 PlaceHolder,因為它是 null/nothing。
另外,我相信您需要將占位符放在某個地方。 否則,您會將項目添加到從未添加到頁面的容器中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.