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类中,如果不存在,则报告错误...即使该方法永远不会被调用。