Динамически создаваемое событие нажатия кнопки не срабатывает
Я провел небольшое исследование по этому вопросу, но ни одно из найденных решений, похоже, не решило мою проблему. У меня есть веб-приложение 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) для их запуска.
Из приведенного вами примера не похоже, что кнопка является динамической; похоже, что вы просто назначаете обработчик событий динамически. Если это так, вам не нужно переназначать обработчик событий каждый раз, когда страница отправляет ответ. В этом отношении вам также не следует переназначать идентификатор, если он уже определен в разметке.
Попробуй это:
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 (на сервере) и обработчик событий останутся без изменений, независимо от того, куда вы пытаетесь переместить элемент управления.