ASP.Net: почему события нажатия / команды моей кнопки не связываются / не запускаются в повторителе? - PullRequest
9 голосов
/ 03 сентября 2008

Вот код из 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 ]

15 голосов
/ 03 сентября 2008

Элементы управления, вложенные в повторители, не перехватывают события. Вместо этого вам нужно привязаться к событию 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
    }
}
4 голосов
/ 03 сентября 2008

Вам нужно обработать событие ItemCommand на вашем повторителе. Вот пример .

Затем ваши нажатия кнопок будут обрабатываться методом ListOfEmails_ItemCommand. Я не думаю, что подключение события Click или Command (для кнопки) в ItemDataBound будет работать.

2 голосов
/ 14 февраля 2011

Если вы планируете использовать событие 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 помогло.

0 голосов
/ 19 ноября 2010

Вы знаете, что расстраивает по этому поводу?

Если вы укажете OnClick в этом теге asp: Button, то сборка будет проверять, существует ли названный метод в классе codebehind, и сообщать об ошибке, если его нет ... даже если это метод никогда не будет вызван.

0 голосов
/ 03 сентября 2008

Вот эксперимент, который вы можете попробовать:

Установите точку останова на ListOfEmails_ItemDataBound и посмотрите, вызывается ли она для обратных передач.

...