ASP.Net:为什么我的按钮的单击/命令事件没有在转发器中绑定/触发?

时间:2020-03-05 18:47:14  来源:igfitidea点击:

这是来自具有中继器的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

没有调用click或者命令,我在做什么错?

解决方案

回答

这是我们可以尝试的实验:

在ListOfEmails_ItemDataBound上设置一个断点,然后查看是否正在为回发调用该断点。

回答

嵌套在Repeater内部的控件不会拦截事件。相反,我们需要绑定到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
            }
        }

编辑:Markdown完全缩进了我的缩进,哦,我还是应该停止在此文本框中编写代码。

回答

我们需要在Repeater上处理ItemCommand事件。这是一个例子。

然后,按钮单击将由ListOfEmails_ItemCommand方法处理。我不认为在ItemDataBound中连接Click或者Command事件(按钮的事件)是可行的。

回答

我们知道对此感到沮丧吗?

如果在asp:Button标记中指定OnClick,则构建将验证命名方法是否存在于codebehind类中,如果不存在,则报告错误...即使该方法永远不会被调用。