Несколько недель назад я создал шаблонный пользовательский элемент управления, по большей части на основе приведенного ниже примера: 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, Repeater и 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);
}
}
Затемв кодовой части тестовой страницы я пытаюсь загрузить и отобразить 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.Когда я отлаживаю тестовую страницу и элемент управления TUC, код TUC получает XPCTemplate в свой LayoutTemplate во время метода Page_Init () TUC, но когда сразу после этого запускается событие InstantiateIn () в XPCTemplate, аргумент «container»NULL.
Я не уверен, почему это происходит, похоже, что метод InstantiateIn () класса XPCTemplate пытается на самом деле установить элемент управления PlaceHolder в TUC, а не просто передать содержимое.Может быть, так и должно быть, и мне не хватает чего-то на стороне TUC, чтобы разрешить такое поведение?
Это первый созданный мной TUC, а также в первый раз, когда он пытается динамически заполнить / загрузить его, поэтомуЯ уверен, что упускаю что-то необходимое для достижения этой цели.Любая помощь очень ценится.
- Андрей