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

单击或命令都没有被调用,我做错了什么?

有帮助吗?

解决方案

嵌套在中继器内的控件不会拦截事件。相反,您需要绑定到 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
    }
}

其他提示

你需要处理 项目命令事件 在您的中继器上。这是 一个例子.

然后,您的按钮点击将由 ListOfEmails_ItemCommand 方法处理。我认为在 ItemDataBound 中连接 Click 或 Command 事件(按钮的)不起作用。

如果您计划使用 ItemCommand 事件,请确保在 Page_Init 中而不是在 Page_Load 中注册 ItemCommand 事件。

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

我不确定为什么在 Page_Load 中注册的此事件对我不起作用,但将其移动到 Page_Init 有帮助。

这里有一个实验供您尝试:

在 ListOfEmails_ItemDataBound 上设置断点并查看是否调用它进行回发。

你知道这有什么令人沮丧的吗?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top