没有发射ASP.NET动态命令按钮事件 [英] ASP.NET dynamic Command Button event not firing
问题描述
我试图动态地创建命令按钮,但点击相关按钮似乎并没有提高相应CommandButton_Click事件。我注意到,在在SO示例的属性被设置为Button.OnCommand以及的CommandName和CommandArgument但它不是在智能感知一个选项。
所以,问题是,我在做什么错在这里(code下面没有点播),它是在一些其他的方式访问 - 如果是这样,为什么我发现所有的例子显示它.OnCommand ?
编辑:进一步的帮助,我已经添加了处理程序但该事件仍没有开火。按钮位于一个UpdatePanel并在每次回发被重建(连同处理程序)。我创建了如下图所示如果按钮事件触发,它写道:触发的事件到txtTestFired文本框的我在做什么一个简单的例子 - 我只想说,我从来没有见过的。这是真正推动我坚果,任何帮助非常感激地接受。
.aspx文件
<表ID =frmMain=服务器>
< ASP:的ScriptManager ID =scmAddProducts=服务器>
< / ASP:ScriptManager的>
< ASP:的UpdatePanel =服务器>
<&的ContentTemplate GT;
< ASP:文本框ID =txtProduct=服务器>< / ASP:文本框>
< BR />
< ASP:按钮的ID =btnAddItem=服务器文本=添加行/>&安培; NBSP;
< ASP:文本框ID =txtTestFired=服务器>< / ASP:文本框>
< BR />
< BR />
< ASP:面板ID =pnlAddedLines=服务器>< / ASP:面板>
< /&的ContentTemplate GT;
< / ASP:的UpdatePanel>
< /表及GT;
.aspx.vb文件
保护小组btnAddItem_Click(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手btnAddItem.Click
昏暗dtItems作为新System.Data.DataTable 如果会议(项目)是没有那么
昏暗dcColumn作为新System.Data.DataColumn
dcColumn.DataType = Type.GetType(System.String)
dcColumn.ColumnName =产品
dtItems.Columns.Add(dcColumn)
会议(项目)= dtItems
万一 dtItems = CTYPE(会议(项目),System.Data.DataTable)
昏暗drRow作为的System.Data.DataRow
drRow = dtItems.NewRow()
drRow(产品)= txtProduct.Text
dtItems.Rows.Add(drRow) 会议(项目)= dtItems
txtProduct.Text =
结束小组
保护小组Page_ preRender(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手我。preRender
如果不是会议(项目)是没有那么
昏暗dtItems作为System.Data.DataTable = CTYPE(会议(项目),System.Data.DataTable)
昏暗iItemIndex作为整数= 1
对于每个drRow在dtItems.Rows
昏暗btnClose作为新按钮
btnClose.ID =btnClose与& iItemIndex
btnClose.CssClass =formCloseButton
btnClose.Text =X的
AddHandler的btnClose.Click,AddressOf Button_Clicked
pnlAddedLines.Controls.Add(btnClose)
btnClose =什么 昏暗txtProduct =新的TextBox
txtProduct.ID =txtProduct与& iItemIndex
txtProduct.CssClass =FORMTEXT
txtProduct.Text = drRow(产品)
txtProduct.Columns =40
pnlAddedLines.Controls.Add(txtProduct)
iItemIndex + = 1 昏暗litHR =新文字
litHR.Text =<小时/>中
pnlAddedLines.Controls.Add(litHR)
litHR =什么
下一个
万一
结束小组
私人小组Button_Clicked(BYVAL发件人为对象,BYVAL E上System.EventArgs)
txtTestFired.Text =触发的事件
结束小组
从本质上讲,你需要在页面加载,以便一旦创建原始控件能够处理按一下按钮,那么你需要清除的控制和重新生成它们无论是在按钮单击处理程序或者您已经在$ p $完成对渲染 - 我认为这是对click处理干净,所以你需要在同一code两个(preferable重构出一个单独的方法)
下面的例子就是对你来说意味着最低code的变化:
保护小组Page_ preRender(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手我。preRender
如果不是会议(项目)是没有那么
pnlAddedLines.Controls.Clear()
GenerateControls()
万一
结束小组
保护小组的Page_Load(BYVAL发件人为对象,BYVAL E上System.EventArgs)把手Me.Load
如果不是会议(项目)是没有那么
GenerateControls()
万一
结束小组
私人小组GenerateControls()
昏暗dtItems作为System.Data.DataTable = CTYPE(会议(项目),System.Data.DataTable)
昏暗iItemIndex作为整数= 1
对于每个drRow在dtItems.Rows
昏暗btnClose作为新按钮
btnClose.ID =btnClose与& iItemIndex
I'm trying to create Command Buttons dynamically, but clicking the button in question doesn't seem to raise the corresponding CommandButton_Click event. I noticed that in the examples on SO a property is set for Button.OnCommand as well as the CommandName and CommandArgument but it isn't an option in intellisense.
So the question is, what am I doing wrong here (code below without the OnCommand), is it accessed in some other way - if so, why do the examples I've found all show it as .OnCommand?
EDIT: Further to help, I have added the handler however the event is still not firing. The buttons reside in an UpdatePanel and are rebuilt on every postback (along with the handler). I have created a simplified example of what I'm doing which is shown below If the button event fires, it writes "EVENT FIRED" to the txtTestFired Textbox - suffice to say I have never seen that. This is really driving me nuts, any help is very gratefully received.
.aspx file
<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 file
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
Essentially you need to create the original controls once on page load in order to be able to handle the button click, you then need to clear the controls and re-generate them either in the button click handler or as you have done on pre-render - i think it is cleaner on the click handler, so you need the same code in both (preferable refactored out to a separate method)
The example below would mean minimum code changes for you:
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
If Not Session("Items") Is Nothing Then
pnlAddedLines.Controls.Clear()
GenerateControls()
End If
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not Session("Items") Is Nothing Then
GenerateControls()
End If
End Sub
Private Sub GenerateControls()
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
这篇关于没有发射ASP.NET动态命令按钮事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!