Nano Hash - криптовалюты, майнинг, программирование

Динамически добавленный PostBackTrigger в настраиваемом серверном элементе управления некорректно отображается

Я создаю настраиваемый серверный элемент управления, производный от CompositeControl.
Этот элемент управления содержит несколько дочерних элементов управления (Labels, DropDownList, ListSearchExtender и т. Д.). Все они находятся внутри UpdatePanel.
Элемент управления также публикует события. Для этого я добавил два свойства: EnableCallBacks и CallBacksAsPostBacks. Эти два свойства должны настраивать поведение обратной передачи панели обновлений.

Есть идеи, как должна выглядеть правильная реализация?

У меня проблемы с тем, как я это реализовал:

  • PostBackTrigger не всегда отображается в выходном HTML.

  • Наличие как Triggers.Add(trigger), так и Controls.Add(_updatePanel) внутри методов CreateChildControls приводит к тому, что PostBackTrigger всегда отображается, даже если я удалю его позже (например, в RenderControl () или PreRender ()). Если я не добавлю триггер здесь, но позже, он никогда не будет отрисован. На данном этапе у меня еще нет правильных значений всех моих свойств (например, EnableCallBacks и CallBacksAsPostBacks).

  • Невозможно разместить оператор Controls.Add(_updatePanel) внутри метода RenderControl, потому что он слишком поздно для AJAX (последний ist PreRender(), иначе я получаю исключение).

  • В идеале я бы создал все элементы управления в CreateChildControls (), а затем установил их значения позже, например, в PreRender или RenderControl

  • Наличие обоих операторов в методе PreRender приводит к тому, что триггер правильно отображается в зависимости от моих настроек на содержащей странице, но я не получаю DropDownList, заполненный его данными из ViewState (при вызове / обратной передаче).


protected override void CreateChildControls()
{
     base.CreateChildControls();
    _updatePanel = new UpdatePanel();
    _updatePanel.ID = "FprDropDownList_UpPnl";
    _updatePanel.UpdateMode = UpdatePanelUpdateMode.Conditional;

    _label = new FprLabel();
    _label.ID = "FprDropDownList_Lbl";
    _updatePanel.ContentTemplateContainer.Controls.Add(_label);

    _dropDownList = new DropDownList();
    _dropDownList.ID = "FprDropDownList_Ddl";
    _dropDownList.CssClass = "fprDropDownList";
    _dropDownList.AutoPostBack = true;
    _updatePanel.ContentTemplateContainer.Controls.Add(_dropDownList);

    _label.AssociatedControlID = _dropDownList.ClientID;

    _listSearchExtender = new ListSearchExtender();
    _listSearchExtender.ID = "FprDropDownList_Lse";
    _listSearchExtender.TargetControlID = _dropDownList.ClientID;
    _listSearchExtender.PromptPosition = ListSearchPromtPosition;
    _listSearchExtender.PromptCssClass = "fprListSearchExtender";
    _updatePanel.ContentTemplateContainer.Controls.Add(_listSearchExtender);

    _ddlPostBackTrigger = new PostBackTrigger();
    _ddlPostBackTrigger.ControlID = _dropDownList.ClientID;

    //_updatePanel.Triggers.Add(_ddlPostBackTrigger);
    Controls.Add(_updatePanel);
}

protected override void OnPreRender(EventArgs pE)
{
   if (EnableCallBacks) 
   { 
      _dropDownList.SelectedIndexChanged += DropDownList_SelectedIndexChanged; 
   }
   if (EnableCallBacks && CallBacksAsPostBacks) 
   { 
     _updatePanel.Triggers.Add(_ddlPostBackTrigger); 
   }
   //Controls.Add(_updatePanel);
   base.OnPreRender(pE);
}

public override void RenderControl(HtmlTextWriter pWriter)
{
   // Do some things... like set Enable-state of child controls
   base.RenderControl(pWriter);
}

Ответы:


1

Вам следует добавить свои динамические элементы управления в PreInit, чтобы события запускались правильно.

Используйте это событие для следующих целей:

  • Проверьте свойство IsPostBack, чтобы определить, обрабатывается ли страница впервые. Свойства IsCallback и IsCrossPagePostBack
    также были установлены в это время.
  • Создайте или воссоздайте динамические элементы управления.
  • Установите главную страницу динамически.
  • Установите свойство Theme динамически.
  • Прочтите или установите значения свойств профиля.
09.03.2011
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..