Динамически создаваемое событие нажатия кнопки не срабатывает

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

protected void Page_Load(object sender, EventArgs e)
{
    submitButton.Text = "Submit";
    submitButton.ID = "submitButton";
    submitButton.Click += new EventHandler(submitButton_Click);

    SelectionDropDownList.SelectedIndexChanged += new EventHandler(SelectionDropDownList_SelectedIndexChanged);

}


protected void SelectionDropDownList_SelectedIndexChanged(object sender, EventArgs e)
{
    switch (SelectionDropDownList.SelectedIndex)
    {
        case 1:
            //does a redirect
            break;
        case 2:
            Panel1.Controls.Add(submitButton);
            break;
        case 3:
            //does a redirect
            break;
    }
}

protected void submitButton_Click(object sender, EventArgs e)
{
    //can't get this event to fire.
    SubmitSearch();
}

5 ответов

Решение

Как насчет того, чтобы вместо динамического добавления элемента управления всегда добавлять его, но установить Visible=false первоначально. Тогда где вы сейчас добавляете это, вместо этого просто делаете это видимым?

Динамические элементы управления всегда немного сложны в веб-формах.

Это проблема времени. Ваш программный поток выглядит так:

  • Page_Load выполняется, страница отображается.
  • Выпадающий выбран. Обратная запись отправляется на сервер. Page_Load выполняется. Затем событие отправляется в ваш выпадающий экземпляр. SelectedIndexChanged выполняется. Ваша кнопка создана, и страница отображается и отправляется клиенту.
  • Кнопка нажата. Обратная запись отправляется на сервер. Page_Load выполняется. Asp пытается выполнить событие, но кнопка больше не существует. Так что событие игнорируется.

Это одна из неприятных деталей Webforms и веская причина не использовать ее - если вы можете выбирать. Если вам нужно его использовать, http://msdn.microsoft.com/en-us/library/ms178472.aspx может помочь.

Если вы динамически создаете элементы управления в WebForms, вам всегда нужно заново создавать их при каждой обратной передаче и до загрузки ViewState. В противном случае вы получите поврежденный / поврежденный ViewState. Кроме того, я считаю, что события должны быть прикреплены самое позднее в Page.OnLoad(EventArgs e) для их запуска.

Попробуйте создать кнопку в вашем случае 2.

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

Попробуй это:

if (!Page.IsPostBack)
{
    Button1.Click += new EventHandler(Button1_Click);
}

РЕДАКТИРОВАТЬ

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

protected void DropDown1_SelectedIndexChanged(object sender, EventArgs e)
{
     Panel1.Visible = SomeIntValue == 2;
}

В соответствии с вашим текущим кодом:

Если я создаю кнопку в разметке, вот так:

<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" ...>

В приведенном ниже коде я пытаюсь переместить элемент управления на другую панель, например так:

SomePanel.Controls.Add(Button1);

Это не правильный способ сделать то, что вы хотите сделать, но технически говоря ID (на сервере) и обработчик событий останутся без изменений, независимо от того, куда вы пытаетесь переместить элемент управления.

Другие вопросы по тегам