ASP.NET动态命令按钮事件未触发

Chr*_*ris 4 vb.net asp.net webforms button

我正在尝试动态创建命令按钮,但单击有问题的按钮似乎没有引发相应的CommandButton_Click事件.我注意到在SO的示例中,为Button.OnCommand以及CommandName和CommandArgument设置了属性,但它不是intellisense中的选项.

所以问题是,我在这里做错了什么(下面的代码没有OnCommand),是否以其他方式访问 - 如果是这样,为什么我发现的例子都显示为.OnCommand?

编辑:进一步的帮助,我添加了处理程序,但事件仍未触发.这些按钮位于UpdatePanel中,并在每次回发时重建(与处理程序一起).我创建了一个简化的例子,我正在做的事情如下所示:如果按钮事件触发,它会将"EVENT FIRED"写入txtTestFired文本框 - 足以说我从未见过它.这真的让我疯狂,任何帮助都非常感激.

.aspx文件

<form id="frmMain" runat="server">
    <asp:ScriptManager ID="scmAddProducts" runat="server">
    </asp:ScriptManager>
    <asp:updatepanel runat="server">
        <ContentTemplate>
            <asp:TextBox ID="txtProduct" runat="server"></asp:TextBox>
            <br />
            <asp:Button ID="btnAddItem" runat="server" Text="Add Line" />&nbsp;
            <asp:TextBox ID="txtTestFired" runat="server"></asp:TextBox>
            <br />
            <br />
            <asp:Panel ID="pnlAddedLines" runat="server"></asp:Panel>
        </ContentTemplate>
    </asp:updatepanel>
</form>
Run Code Online (Sandbox Code Playgroud)

.aspx.vb文件

Protected Sub btnAddItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddItem.Click
    Dim dtItems As New System.Data.DataTable

    If Session("Items") Is Nothing Then
        Dim dcColumn As New System.Data.DataColumn
        dcColumn.DataType = Type.GetType("System.String")
        dcColumn.ColumnName = "Product"
        dtItems.Columns.Add(dcColumn)
        Session("Items") = dtItems
    End If

    dtItems = CType(Session("Items"), System.Data.DataTable)
    Dim drRow As System.Data.DataRow
    drRow = dtItems.NewRow()
    drRow("Product") = txtProduct.Text
    dtItems.Rows.Add(drRow)

    Session("Items") = dtItems
    txtProduct.Text = ""
End Sub
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    If Not Session("Items") Is Nothing Then
        Dim dtItems As System.Data.DataTable = CType(Session("Items"), System.Data.DataTable)
        Dim iItemIndex As Integer = 1
        For Each drRow In dtItems.Rows
            Dim btnClose As New Button
            btnClose.ID = "btnClose" & iItemIndex
            btnClose.CssClass = "formCloseButton"
            btnClose.Text = "X"
            AddHandler btnClose.Click, AddressOf Button_Clicked
            pnlAddedLines.Controls.Add(btnClose)
            btnClose = Nothing

            Dim txtProduct = New TextBox
            txtProduct.ID = "txtProduct" & iItemIndex
            txtProduct.CssClass = "formText"
            txtProduct.Text = drRow("Product")
            txtProduct.Columns = "40"
            pnlAddedLines.Controls.Add(txtProduct)
            iItemIndex += 1

            Dim litHR = New Literal
            litHR.Text = "<hr />"
            pnlAddedLines.Controls.Add(litHR)
            litHR = Nothing
        Next
    End If
End Sub
Private Sub Button_Clicked(ByVal sender As Object, ByVal e As System.EventArgs)
    txtTestFired.Text = "EVENT FIRED"
End Sub
Run Code Online (Sandbox Code Playgroud)

Joh*_*dol 6

你必须像这样连接它(在C#中):

myButton.Click += new EventHandler(this.Button_Clicked);
Run Code Online (Sandbox Code Playgroud)

或者你可以注入属性 - > onclick = "Button_Clicked"像这样:

myButton.Attributes.Add("onclick", "Button_Clicked");
Run Code Online (Sandbox Code Playgroud)

如果你想在VB.NET中使用它,请转到此页面并将自己淘汰出局 - 我可以为你做,但重点是什么:)

编辑:请记住,您必须在每次页面加载时重新连接事件处理程序(如上所示).

编辑:好的 - 我现在看到问题,你添加了其余的代码.您正在pre_render上连接事件处理程序.事件处理程序在load_complete之前执行,这发生在pre_render之前.这就是event_handler没有执行的原因:你在页面生命周期中添加它太晚了.将该代码放在page_load例程中,它应该可以工作.