Свойства пользовательского веб-элемента управления и триггер события - PullRequest
0 голосов
/ 04 марта 2012

Недавно я создал веб-элемент управления в asp.net, который представляет принтер.Пользовательский элемент управления содержит флажок, который я использую для установки свойства IsChecked:

    protected bool isChecked;

    /// <summary>
    /// Is printer selected
    /// </summary>
    public bool IsChecked
    {
        get { return isChecked; }
        set { isChecked = value; }
    }

    protected void chkIsSelected_CheckedChanged(object sender, EventArgs e)
    {
        if (isChecked)
        {
            isChecked = false;
        }
        else
        {
            isChecked = true;
        }
    }

Я хочу иметь возможность выбирать принтеры с помощью флажков (также для нескольких выборок) и использовать кнопку «Добавить выбранное», чтобы добавитьвыбранные «принтеры (пользовательские элементы управления)».

  protected void btnSubmitSelection_Click(object sender, EventArgs e)
    {
        Dictionary<string, string> addResults = new Dictionary<string, string>();

        foreach (PrinterControlSearch pctrl in printerControls)
        {

            if (pctrl.IsChecked)
            {
                addResults.Add(pctrl.printer.PrinterName, PrinterOperations.addPrinter(client, pctrl.printer));
            }
        }
     }

Все работает нормально, если я добавляю веб-элементы управления в событиях Page_Init или Page_Load.События CheckedChanged запускаются по одному для каждого проверенного элемента управления после запуска обратной передачи с помощью кнопки AddSelected на главной странице, и свойство IsChecked устанавливается так, как должно быть для отмеченных флажков.

Однако, если я добавлювеб-элементы управления на странице с методом, который вызывается обратной передачей от кнопки поиска, например, элементы управления отображаются нормально, но события CheckedChanged никогда не срабатывают на обратной передаче AddSelected, а свойство IsChecked всегда ложно, поскольку оно никогда не устанавливается,CheckBox, который я использую, не вызывает AutoPostBack.

Почему это происходит и как я могу заставить его работать каждый раз?

Я полагаю, это как-то связано с ViewState элементов управления, но это не имеет особого смысла для меня, потому что даже если ядобавить элементы управления в событие Page_Load. Я не устанавливаю никаких свойств после метода container.AddControl () для ViewState, чтобы догнать жизненный цикл страницы, и событие CheckedChanged по-прежнему срабатывает.Спасибо

1 Ответ

1 голос
/ 04 марта 2012

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

Это необходимо для запуска событий и правильной загрузки ViewState, в противном случае данные обратной передачи теряются, и вы никогда не увидите никаких изменений (например, Checked-состояние CheckBox или свойство Text * TextBox).

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

Цикл динамически создаваемых элементов управления

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