Назначить событие для пользовательского элемента управления внутри элемента управления Repeater
У меня есть элемент управления Repeater, который в некоторых его ячейках содержит UserControl, который содержит DropDownList. В событии ItemDataBound элемента управления Repeater я назначаю событие DropDownList следующим образом:
protected void MyRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
...
MyControl myControl = (MyControl)e.Item.FindControl("MyControl01");
myControl.DataSource = myObject;
myControl.DataBind();
myControl.DropDownList.SelectedItemChange += MyMethod_SelectedIndexChanged;
myControl.DropDownList.AutoPostBack = true;
....
}
protected void MyMethod_SelectedIndexChanged(object sender, EventArgs e)
{
//Do something.
}
Событие никогда не начинается. Пожалуйста, мне нужна помощь.
3 ответа
Ваше событие не вызывается в PostBack, потому что ваш обработчик событий не был прикреплен (он присоединяется только во время итерации жизненного цикла страницы, когда ваш ретранслятор привязан к данным).
Если вы прикрепите обработчик событий декларативно в разметке, например:
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:DropDownList ID="DropDownList1" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
</ItemTemplate>
</asp:Repeater>
Тогда ваш обработчик событий будет вызываться во время PostBacks.
Есть две вещи, которые вы можете попробовать посмотреть, поможет ли это:
- Попробуйте связать свой MyRepeater с каждым запросом страницы, а не только когда!IsPostBack.
- Свяжите MyRepeater внутри OnInit.
1) Если динамически созданные элементы управления создаются при первой загрузке страницы, а затем снова при обратной передаче, ASP.NET заметит, что возникшее событие совпадает, и запустит событие.
Для 2) Дизайнер всегда использовал прикрепление события в OnInit, хотя в OnLoad это тоже должно работать.
Сначала убедитесь, что привязка данных не сбрасывает выпадающие списки.
Вот код для элемента управления, который будет вложен в повторитель ItemTemplate.
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ListBoxContainer.ascx.cs" Inherits="OAAF.Common.ListBoxContainer" %>
<asp:ListBox ID="lstFromControl" runat="server" Rows="1" DataTextField="Text" DataValueField="Id" OnSelectedIndexChanged="LstFromControl_SelectedIndexChanged" AutoPostBack="true" />
Код для элемента управления, который будет вложен в повторитель ItemTemplate
public partial class ListBoxContainer : System.Web.UI.UserControl
{
//declare the event using EventHandler<T>
public event EventHandler<EventArgs> ListBox_SelectedIndexChanged;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void LstFromControl_SelectedIndexChanged(object sender, EventArgs e)
{
//fire event: the check for null sees if the delegate is subscribed to
if (ListBox_SelectedIndexChanged != null)
{
ListBox_SelectedIndexChanged(sender, e);
}
}
}
Обратите внимание, что этот элемент управления использует внутреннее событие изменения списка, а затем запускает собственное событие: ListBox_SelectedIndexChanged. Вы также можете создавать собственные аргументы событий, но для этого используются стандартные EventArgs.
Ваш ретранслятор, который имеет контроль, может выглядеть так
<asp:Repeater ID="rptTest" runat="server">
<ItemTemplate>
<br />
<ctrl:wucListBox ID="listBoxControl" runat="server" OnListBox_SelectedIndexChanged="ListBoxControl_SelectedIndexChanged" />
</ItemTemplate>
</asp:Repeater>
Зарегистрируйте элемент управления вверху страницы, например, на повторителе.
<%@ Register Src="~/Common/ListBoxContainer.ascx" TagName="wucListBox" TagPrefix="ctrl" %>
Он обрабатывает событие ListBox_SelectedIndexChanged, а метод, который обрабатывает это, находится в коде позади страницы, на которой находится повторитель.
protected void ListBoxControl_SelectedIndexChanged(object sender, EventArgs e)
{
//some code
}