ASP.Net: why is my button's click/command events not binding/firing in a repeater?

那年仲夏 提交于 2019-11-27 02:21:16

问题


Here's the code from the ascx that has the repeater:

<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>

And in the codebehind for the repeater's databound and events:

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

Neither the click or command is getting called, what am I doing wrong?


回答1:


Controls nested inside of Repeaters do not intercept events. Instead you need to bind to the Repeater.ItemCommand Event.

ItemCommand contains RepeaterCommandEventArgs which has two important fields:

  • CommandName
  • CommandArgument

So, a trivial example:

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
    }
}



回答2:


You need to handle the ItemCommand event on your Repeater. Here's an example.

Then, your button clicks will be handled by the ListOfEmails_ItemCommand method. I don't think wiring up the Click or Command event (of the button) in ItemDataBound will work.




回答3:


If you're planning to use ItemCommand event, make sure you register to ItemCommand event in Page_Init not in Page_Load.

protected void Page_Init(object sender, EventArgs e)
{
    // rptr is your repeater's name
    rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand);
}

I am not sure why it wasn't working for me with this event registered in Page_Load but moving it to Page_Init helped.




回答4:


Here's an experiment for you to try:

Set a breakpoint on ListOfEmails_ItemDataBound and see if it's being called for postbacks.




回答5:


You know what's frustrating about this?

If you specify an OnClick in that asp:Button tag, the build will verify that the named method exists in the codebehind class, and report an error if it doesn't... even though that method will never get called.



来源:https://stackoverflow.com/questions/42396/asp-net-why-is-my-buttons-click-command-events-not-binding-firing-in-a-repeate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!