Сведения о вопросе

SOON

22:06, 7th August, 2020

Теги

Создание UserControl программно внутри ретранслятора?

Просмотров: 537   Ответов: 4

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

Я привязываюсь к событию 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);
    }
}

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

Есть какие-нибудь идеи?



  Сведения об ответе

ASSembler

13:11, 7th August, 2020

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


  Сведения об ответе

prince

03:39, 27th August, 2020

Эх, придумал один способ это сделать:

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

Это кажется глупым иметь такой файл depedancy, но, возможно, именно так UserControls и должно быть сделано.


  Сведения об ответе

DAAA

11:23, 14th August, 2020

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

Управление ctrl=this.LoadControl(Request.ApplicationPath +"/Controls/" +ControlName);


  Сведения об ответе

qwerty101

07:20, 8th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться