ASP.Net: почему события нажатия / команды моей кнопки не связываются / не запускаются в повторителе?
Вот код из ascx, у которого есть повторитель:
<asp:Repeater ID="ListOfEmails" runat="server" >
<HeaderTemplate><h3>A sub-header:</h3></HeaderTemplate>
<ItemTemplate>
[Some other stuff is here]
<asp:Button ID="removeEmail" runat="server" Text="X" ToolTip="remove" />
</ItemTemplate>
</asp:Repeater>
И в коде для базы данных и событий ретранслятора:
Protected Sub ListOfEmails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles ListOfEmails.ItemDataBound
If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
Dim removeEmail As Button = CType(e.Item.FindControl("removeEmail"), Button)
removeEmail.CommandArgument = e.Item.ItemIndex.ToString()
AddHandler removeEmail.Click, AddressOf removeEmail_Click
AddHandler removeEmail.Command, AddressOf removeEmail_Command
End If
End Sub
Sub removeEmail_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Response.Write("<h1>click</h1>")
End Sub
Sub removeEmail_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
Response.Write("<h1>command</h1>")
End Sub
Не вызывается ни щелчок, ни команда, что я делаю не так?
5 ответов
Элементы управления, вложенные в повторители, не перехватывают события. Вместо этого вам нужно привязать к Repeater.ItemCommand
Событие.
ItemCommand
содержит RepeaterCommandEventArgs
который имеет два важных поля:
- Имя_команды
- CommandArgument
Итак, тривиальный пример:
void rptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
{
// Stuff to databind
Button myButton = (Button)e.Item.FindControl("myButton");
myButton.CommandName = "Add";
myButton.CommandArgument = "Some Identifying Argument";
}
}
void rptr_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Add")
{
// Do your event
}
}
Вам нужно обработать событие ItemCommand на вашем повторителе. Вот пример.
Затем ваши нажатия кнопок будут обрабатываться методом ListOfEmails_ItemCommand. Я не думаю, что подключение события Click или Command (кнопки) в ItemDataBound будет работать.
Если вы планируете использовать событие ItemCommand, убедитесь, что вы зарегистрировались в событии ItemCommand в Page_Init, а не в Page_Load.
protected void Page_Init(object sender, EventArgs e)
{
// rptr is your repeater's name
rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand);
}
Я не уверен, почему это не работает для меня с этим событием, зарегистрированным в Page_Load, но перемещение в Page_Init помогло.
Вот эксперимент для вас, чтобы попробовать:
Установите точку останова на ListOfEmails_ItemDataBound и посмотрите, вызывается ли она для обратных передач.
Вы знаете, что расстраивает по этому поводу?
Если вы укажете OnClick в этом теге asp:Button, сборка проверит, что названный метод существует в классе codebehind, и сообщит об ошибке, если его нет... даже если этот метод никогда не будет вызван.