以下是带有转发器的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
点击或命令都没有被调用,我做错了什么?
答案 0 :(得分:15)
嵌套在Repeater内部的控件不拦截事件。相反,您需要绑定到Repeater.ItemCommand
事件。
ItemCommand
包含RepeaterCommandEventArgs
,其中包含两个重要字段:
所以,一个简单的例子:
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
}
}
答案 1 :(得分:4)
您需要处理Repeater上的ItemCommand event。这是an example。
然后,您的按钮点击将由ListOfEmails_ItemCommand方法处理。我不认为连接ItemDataBound中的Click或Command事件(按钮)会起作用。
答案 2 :(得分:2)
如果您打算使用ItemCommand事件,请确保在Page_Init中注册ItemConmand事件而不是在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有帮助,这对我不起作用。
答案 3 :(得分:0)
以下是您尝试尝试的实验:
在ListOfEmails_ItemDataBound上设置一个断点,看看是否要为回发调用它。
答案 4 :(得分:0)
你知道这有什么令人沮丧的吗?
如果在asp:Button标签中指定OnClick,则构建将验证codebehind类中是否存在指定的方法,如果不存在则报告错误...即使该方法永远不会被调用。