Динамически добавлять элементы управления в шаблонный пользовательский элемент управления? - PullRequest
0 голосов
/ 16 августа 2011

Несколько недель назад я создал шаблонный пользовательский элемент управления, по большей части на основе приведенного ниже примера: 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, а также в первый раз, когда он пытается динамически заполнить / загрузить его, поэтомуЯ уверен, что упускаю что-то необходимое для достижения этой цели.Любая помощь очень ценится.

- Андрей

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Нашел решение проблемы, именно так я загружал TUC.

Неправильно:

xpcRegion = new ExpandCollapseRegion();

Правильно:

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

Внесение этого простого изменения помогло решить проблему. Кроме того, обнаружил, что я мог отказаться от необходимости пользовательского класса ITemplate с помощью метода CompiledTemplateBuilder(). Действительно упрощает код.

- Андрей

0 голосов
/ 16 августа 2011

Я полагаю, что проблема в том, что вы не создали экземпляр своего PlaceHolder ph, который вы передаете в свой шаблон. Таким образом, строка, на которую он жалуется, заключается в том, что он не может добавить элемент управления в PlaceHolder, потому что он пуст / ничего.

Кроме того, я полагаю, вам нужно где-то поместить свой заполнитель. В противном случае вы добавляете элементы в контейнер, который никогда не добавляется на страницу.

...