【问题标题】:ASP.Net: why is my button's click/command events not binding/firing in a repeater?ASP.Net:为什么我的按钮的单击/命令事件没有在转发器中绑定/触发?
【发布时间】:2010-09-07 17:30:27
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net vb.net .net-2.0 repeater button


    【解决方案1】:

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

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

    【讨论】:

    • 为什么?你能详细说明一下吗?我真的不认为这算作“答案”,也许您应该将其添加为“评论”。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您需要处理中继器上的ItemCommand event。这里是an example

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          如果您打算使用 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 会有所帮助。

          【讨论】:

            猜你喜欢
            • 2017-03-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-01
            • 1970-01-01
            • 2015-01-11
            • 2010-10-21
            相关资源
            最近更新 更多