Динамично добавленные средства управления у Asp. Сеть

Первая строка вашего конструктора вашего подкласса должна быть вызовом super(), чтобы гарантировать, что вызывается конструктор суперкласса.

9
задан Ishmaeel 14 October 2008 в 10:29
поделиться

9 ответов

Я соглашаюсь с другими точками зрения, сделанными здесь, "Если можно выйти из создания средств управления динамично, затем сделайте так..." (@Jesper Blad Jenson иначе), но вот прием, который я разработал с динамично созданными средствами управления в прошлом.

Проблема становится курицей и яйцом. Вам нужен Ваш ViewState для создания дерева управления, и Вам нужно Ваше дерево управления, созданное для достигания ViewState. Ну, это почти корректно. Существует способ достигнуть Ваши значения ViewState непосредственно перед тем, как остальная часть дерева заполняется. Это путем переопределения LoadViewState(...) и SaveViewState(...).

В хранилище SaveViewState управление Вы хотите создать:

protected override object SaveViewState()
{
    object[] myState = new object[2];
    myState[0] = base.SaveViewState();
    myState[1] = controlPickerDropDown.SelectedValue;

    return myState
}

Когда платформа назовет Ваше переопределение "LoadViewState", Вы возвратите точный объект, который Вы возвратили из "SaveViewState":

protected override void LoadViewState(object savedState) 
{
    object[] myState = (object[])savedState;

    // Here is the trick, use the value you saved here to create your control tree.
    CreateControlBasedOnDropDownValue(myState[1]);

    // Call the base method to ensure everything works correctly.
    base.LoadViewState(myState[0]);
}

Я использовал это успешно для создания страниц ASP.Net, где DataSet был сериализирован к ViewState для хранения изменений во всей сетке данных, разрешающих пользователю сделать несколько редактирований с PostBacks и наконец фиксировать все их изменения в единственной операции "Сохранения".

8
ответ дан 4 December 2019 в 14:32
поделиться

Необходимо добавить управление в событии OnInit, и состояние отображения будет сохранено. Не используйте, если (ispostback), потому что средства управления должны быть добавлены каждый раз, событие в обратной передаче!
(De)Serialization состояния отображения происходит после OnInit и перед OnLoad, таким образом, Ваш поставщик решения для хранения данных состояния отображения будет видеть динамично добавленные средства управления, если они будут добавлены в OnInit.

Но в сценарии Вы описываете, вероятно, мультипросматриваете, или простой скрываются/показывают (свойство видимости) будет лучшее решение.
Это - потому что в событии OnInit, когда необходимо считать выпадающий и добавить новые средства управления, состояние отображения еще не читается (десериализованное), и Вы не знаете то, что сделало пользователя, выбирают! (можно сделать request.form (), но это чувствует вид несправедливости),

3
ответ дан 4 December 2019 в 14:32
поделиться

Борясь с этой проблемой для в том, в то время как я придумал эти groundrules, который, кажется, работает, но YMMV.

  • Используйте декларативные средства управления, когда это возможно,
  • Используйте привязку данных, если это возможно,
  • Поймите, как ViewState работает
  • Свойство Visibilty может иметь большое значение
  • Если необходимо использовать, добавляют, что средства управления в обработчике событий используют подсказку Aydsman и воссоздают средства управления в переопределенном LoadViewState.

ДЕЙСТВИТЕЛЬНО Понимание ViewState является обязательным для чтения.

Понимание Динамических Средств управления Примером показывает некоторые методы о том, как использовать привязку данных вместо динамических средств управления.

ДЕЙСТВИТЕЛЬНО Понимание Динамических Средств управления также разъясняет методы, которые могут использоваться для предотвращения динамических средств управления.

Надежда это помогает другим с теми же проблемами.

2
ответ дан 4 December 2019 в 14:32
поделиться

Хорошо. Если бы можно выйти из создания средств управления динамично, то сделайте так - иначе, что я сделал бы, должен использовать Page_Load вместо Page_Init, но вместо того, чтобы поместить материал в Если Не IsPostBack, то установленный i просто непосредственно в методе.

0
ответ дан 4 December 2019 в 14:32
поделиться

Я думаю, что ответ здесь находится в MultiView управление, так, чтобы, например, выпадающие переключатели между различными взглядами в мультипредставлении.

Можно, вероятно, даже связать с данными свойство текущего представления мультипредставления к значению выпадающего!

0
ответ дан 4 December 2019 в 14:32
поделиться

Единственный корректный ответ был дан Aydsman. LoadViewState является единственным местом для добавления динамических средств управления, где их значения состояния отображения будут восстановлены при воссоздании и можно получить доступ к состоянию отображения для определения который средства управления добавить.

0
ответ дан 4 December 2019 в 14:32
поделиться

А-ч, это - проблема с текучей абстракцией веб-форм ASP.NET.

Возможно, Вам будет интересно смотреть на ASP.NET MVC, который использовался для создания этого веб-сайта stackoverflow.com? Это должно быть более легким пригодным для Вас, прибыв из PHP (таким образом, pedal-to-the-metal когда дело доходит до HTML и JavaScript) фон.

0
ответ дан 4 December 2019 в 14:32
поделиться

Я натыкался на это в книге "Pro ASP.NET 3.5 в 2008 C#" под разделом Dynamic Control Creation:

Если необходимо воссоздать управление многократно, необходимо выполнить создание управления на Странице. Загрузите обработчик событий. Это обладает дополнительным преимуществом разрешения Вам использовать состояние отображения с Вашим динамическим управлением. Даже при том, что состояние отображения обычно восстанавливается перед Страницей. Событие загрузки, если Вы создаете управление в обработчике для Страницы. Событие загрузки, ASP.NET применит любую информацию о состоянии отображения, которую оно имеет после Страницы. Загрузите концы обработчика событий. Этот процесс является автоматическим.

Я не протестировал это, но Вы могли бы изучить его.

0
ответ дан 4 December 2019 в 14:32
поделиться

Если действительно необходимо использовать динамические средства управления, следующее должно работать:

  • В OnInit воссоздайте ту же самую иерархию управления, которая была на странице, когда предыдущий запрос был обработан. (Если это не начальный запрос, конечно),
  • После OnInit платформа загрузит состояние отображения из предыдущего запроса, и все Ваши средства управления должны быть в устойчивом состоянии теперь.
  • В OnLoad удалите средства управления, которые не требуются и добавляют необходимые. Необходимо будет также так или иначе сохранить текущее дерево управления в этой точке, чтобы использоваться в первом шаге во время следующего запроса. Вы могли использовать переменную сеанса, которая диктует, как динамическое дерево управления было создано. Я даже сохранил целый набор Средств управления на сессии однажды (отложите свои вилы, это было только для демонстрации).

Передобавление "устаревших" средств управления, в которых Вы не будете нуждаться и будете удалены в OnLoad так или иначе, кажется немного изворотливым, но Asp. Сеть не была действительно разработана с динамическим созданием управления в памяти. Если та же самая иерархия управления не сохраняется во время загрузки состояния отображения, все виды трудно ошибок находки начинают скрываться на странице, потому что состояния более старых средств управления загружаются в недавно добавленные.

Читайте на Asp. Сетевой жизненный цикл страницы и особенно о том, как состояние отображения работает и это станет ясным.

Править: Это - очень хорошая статья о том, как состояние отображения ведет себя и что необходимо рассмотреть при контакте с динамическими средствами управления: http://geekswithblogs.net/FrostRed/archive/2007/02/17/106547.aspx

1
ответ дан 4 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: