【发布时间】:2010-12-19 01:08:47
【问题描述】:
我正在尝试动态创建命令按钮,但单击相关按钮似乎不会引发相应的 CommandButton_Click 事件。我注意到在 SO 的示例中,为 Button.OnCommand 以及 CommandName 和 CommandArgument 设置了一个属性,但它不是智能感知中的选项。
所以问题是,我在这里做错了什么(下面没有 OnCommand 的代码),是否以其他方式访问它 - 如果是这样,为什么我找到的示例都显示为 .OnCommand?
编辑: 为了进一步提供帮助,我添加了处理程序,但事件仍未触发。这些按钮位于 UpdatePanel 中,并在每次回发时重建(连同处理程序)。我已经创建了一个我正在做的简化示例,如下所示如果按钮事件触发,它会将“事件触发”写入 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
【问题讨论】:
-
在我的回答中查看编辑以回复您的编辑
-
移动到 page_load 并且事件触发......但是......现在是一个不同的问题(这就是我最初将它放在 pre_render 中的原因)。按钮单击事件(添加文本框等)发生在页面生命周期中的页面加载之后。因此,当我将它添加到我的测试中时,我遇到了系统总是一个回发的问题 - 即您必须在第一组控件呈现之前提交两次。
-
我认为您的原始问题已正确解决(事件未触发)-您当前的问题可能应该作为单独的问题添加。听起来有点像您添加新控件为时已晚,您是否在点击处理程序期间重定向?
-
谢谢,事件仍然没有在需要的上下文中触发。如果这是不可能的,那么sobeit,但我宁愿在创建一个几乎重复的问题之前在上下文中继续这个问题。问题的症结在于用户单击了一个创建控件的按钮。控件不知道它们需要在 page_load 中创建,因为尚未处理按钮单击事件。有一个快速而肮脏的修复方法,每次提交后都会进行虚假的回发或重新加载,但这既笨拙又令人讨厌。
标签: asp.net vb.net webforms button