没有发射ASP.NET动态命令按钮事件 [英] ASP.NET dynamic Command Button event not firing

查看:128
本文介绍了没有发射ASP.NET动态命令按钮事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图动态地创建命令按钮,但点击相关按钮似乎并没有提高相应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" />&nbsp;
            <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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆