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" />
<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)
你必须像这样连接它(在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例程中,它应该可以工作.