我试图动态地创建命令按钮,但单击有问题的按钮似乎不会引发相应的CommandButton_Click事件。我注意到在SO的例子中,一个属性被设置为Button.OnCommand以及CommandName和CommandArgument,但它不是intellisense中的一个选项。ASP.NET动态命令按钮事件没有触发
所以问题是,我在这里做错了什么(下面的代码没有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" />
<asp:TextBox ID="txtTestFired" runat="server"></asp:TextBox>
<br />
<br />
<asp:Panel ID="pnlAddedLines" runat="server"></asp:Panel>
</ContentTemplate>
</asp:updatepanel>
</form>
.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
请参阅我的答案中的编辑以回复您的编辑 – JohnIdol 2009-11-23 10:29:28
已移至page_load并触发事件...但是...现在出现了另一个问题(这就是为什么我最初将它放在pre_render中)。按钮单击事件(添加文本框等)发生在页面生命周期中的页面加载之后。因此,当我将其添加到我的测试中时,我得到的问题是系统始终是一个回传 - 即在呈现第一组控件之前必须提交两次。 – Chris 2009-11-23 19:32:24
我认为你的原始问题可以正确解决(事件不会触发) - 你当前的问题应该作为一个单独的问题添加。听起来有点像你可能加入新控件的时间太晚了,你是否在点击处理程序中重新定向? – dice 2009-11-23 19:47:19