Создание UserControl программно в ретрансляторе? - PullRequest
0 голосов
/ 27 августа 2008

У меня есть повторитель, связанный с некоторыми данными.

Я связываюсь с событием ItemDataBound и пытаюсь программно создать UserControl :

В двух словах:

void rptrTaskList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    CCTask task = (CCTask)e.Item.DataItem;

    if (task is ExecTask)
    {
        ExecTaskControl foo = new ExecTaskControl();
        e.Item.Controls.Add(foo);
    }
}

Проблема в том, что, хотя привязка работает, пользовательский элемент управления не отображается на главной странице.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 27 августа 2008

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

1 голос
/ 27 августа 2008

Эх, разобрался, как это сделать:

ExecTaskControl foo = (ExecTaskControl)LoadControl("tasks\\ExecTaskControl.ascx");

Кажется глупым иметь такую ​​файловую депеданцию, но, возможно, именно так должны выполняться UserControls.

0 голосов
/ 27 августа 2008

Если вы собираетесь сделать это из места, где у вас нет экземпляра страницы, вам нужно сделать еще один шаг вперед (например, из веб-службы для возврата html или из задачи, отрисовывающей электронную почту)

var myPage = new System.Web.UI.Page();
var myControl = (Controls.MemberRating)myPage.LoadControl("~/Controls/MemberRating.ascx");

Я нашел эту технику на сайте Скотта Гитри, поэтому я полагаю, что это законный способ сделать это в .NET

0 голосов
/ 27 августа 2008

Я думаю, что @Craig находится на правильном пути в зависимости от деталей проблемы, которую вы решаете. Добавьте его в ретранслятор и удалите его или установите Visible = "false", чтобы скрыть его там, где это необходимо. Viewstate становится сложнее с динамически создаваемыми элементами управления / пользовательскими элементами управления, так что Google или отметьте здесь , если вам нужно добавить динамически. В указанной статье также показан альтернативный способ динамической загрузки:

Control ctrl = this.LoadControl (Request.ApplicationPath + "/ Controls /" + ControlName);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...