Не удается получить значения в событии OnInit - PullRequest
1 голос
/ 01 октября 2010

Я понимаю порядок событий, происходящих с жизненным циклом страницы, но это не помогает в моей ситуации.У меня есть флажок, который заполняется каталогом, заполненным формами.Когда я устанавливаю флажок рядом с именем формы, мне бы хотелось, чтобы он динамически создавал шаг мастера и вставлял форму.

Порядок событий: OnInit: GatherForms () - проверяет каталог и загружает все имена формв флажок LoadForms () - проверяет «выбранный» сеанс и загружает собранные формы

CheckBoxList: SelectedIndexChanged #AutoPost = true # PopulateForms () - просматривает флажки и добавляет их в состояние сеанса

Когда пользователь нажимает флажок, он выполняет обратную передачу и нажимает OnInit, который извлекает из сеанса.Проблема в том, что PopulateForms () еще не был запущен, поэтому он ничего не заполнял, даже если он проверен.Если я щелкну другой элемент, он будет опубликован и появится.Кажется, я не могу извлечь какую-либо полезную информацию из флажка перед обновлением, что означает, что я не могу видеть, что формы появляются немедленно.Я также попытался зациклить флажок, но, к сожалению, viewstate еще не опубликовал.вздох.

Есть предложения?

Спасибо!

PS: я не могу использовать Request.Form [], потому что мне нужно вытащить все выбранные элементы из флажка.может быть, я могу, но я не могу найти способ: /

Ответы [ 3 ]

1 голос
/ 01 октября 2010

Добавляйте только свои динамические элементы управления в OnInit.Не занимайтесь заполнением / обработкой до PageLoad.Таким образом вы сохраните свои ценности.

1 голос
/ 01 октября 2010

Это распространенная проблема, с которой я сталкиваюсь по мере того, как я становлюсь лучше в ASP.NET.

С динамическими элементами управления у вас возникает проблема их отсутствия на самом деле во время OnInit.do создает все элементов управления, которые пользователь может видеть во время OnInit, и скрывает элементы, которые пользователь не увидит в коде.Страница загрузится, будут созданы все возможные элементы управления (в коде - не беспокойтесь об этом, появившемся в HTML-коде и раздутом), затем сработает обработчик событий, а затем вы сможете настроить видимость вашего мастера.

Например:

public void OnInit(object sender, EventArgs e)
{
    GatherForms();
    CreateWizardForm(); // creates a wizard and adds controls it will need
}

private void Checkbox_Checked(object sender, EventArgs e)
{
    var checkBox = (CheckBox)sender;
    // append checkBox.SelectedValue to session state object of checkboxes
}

protected override void OnPreRender(object sender, EventArgs e)
{
    if (/* Session checkboxes contain values */)
    {
        this.WizardForm.Visible = true;
        this.CheckboxList.Visible = false;
    }
}

Это работает, если вы заранее знаете, какие элементы управления будут в форме мастера.Вы можете изменить значения этих элементов управления в событии OnPreRender, переключить их видимость и т. Д., Но вы не можете перейти и добавить новые элементы управления (например, Controls.Add (new Button ())) - это необходимо сделать в OnInit.событие.

0 голосов
/ 01 октября 2010

Классическая ловушка с динамическим управлением.

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

В OnInit() опубликованные значения есть, но они еще не были обработаны ViewState. Таким образом, вы можете просто набрать if (Request["myCheckBoxName"] == xxx) для работы с отдельными флажками или, если вы можете использовать Request["__EVENTTARGET"], получить имя элемента управления, вызвавшего обратную передачу.

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

...