Asp.net 动态添加的按钮单击事件仅触发一次

Asp.net 动态添加的按钮单击事件仅触发一次,asp.net,vb.net,button,dynamic,click,Asp.net,Vb.net,Button,Dynamic,Click,嗯,这似乎是一个重复的老问题,但我找不到任何解决办法。我正在编写一个web应用程序,它有许多表单,除一个表单外,所有表单都可以很好地使用AJAX。此表单有两个查询面板和两个用于添加和编辑项的部分。一个查询面板用于搜索现有项目,另一个用于帮助添加/编辑流程。整个表单ASP.NET代码为: <%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Masters/Forms.Master" CodeBeh

嗯,这似乎是一个重复的老问题,但我找不到任何解决办法。我正在编写一个web应用程序,它有许多表单,除一个表单外,所有表单都可以很好地使用AJAX。此表单有两个查询面板和两个用于添加和编辑项的部分。一个查询面板用于搜索现有项目,另一个用于帮助添加/编辑流程。整个表单ASP.NET代码为:

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Masters/Forms.Master" CodeBehind="EditBrands.aspx.vb" Inherits="PharmaManageWeb.EditBrands" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <title>ویرایش برندها</title>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="PageContent" runat="server">
    <asp:ScriptManagerProxy runat="server" ID="PageScriptsProxy">
    </asp:ScriptManagerProxy>
    <asp:Table runat="server" CssClass="formtable">
        <asp:TableRow runat="server">
            <asp:TableCell runat="server">
                <asp:UpdatePanel runat="server" ID="AddPanel" UpdateMode="Conditional">
                    <ContentTemplate>
                        <asp:Table runat="server" ID="AddTable" CssClass="formtable">
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="2">
                                    افزودن برند:
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">
                                    نام:
                                </asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:TextBox runat="server" ID="AddName" CssClass="rtlinput" Width="250px"></asp:TextBox>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">
                                    کد ژنریک:
                                </asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:TextBox runat="server" ID="AddCode" CssClass="ltrinput" Width="100px"></asp:TextBox>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">
                                    نام ژنریک:
                                </asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:TextBox runat="server" ID="AddGName" CssClass="ltrinput" Width="250px" Enabled="false"></asp:TextBox>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">&nbsp;</asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:Label runat="server" ID="AddErrMsg" ForeColor="Red"></asp:Label>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">&nbsp;</asp:TableCell>
                                <asp:TableCell runat="server" CssClass="buttoncell">
                                    <asp:Button runat="server" ID="SubmitAdd" Text="ارسال" OnClick="DoAdd" />
                                </asp:TableCell>
                            </asp:TableRow>
                        </asp:Table>
                    </ContentTemplate>
                </asp:UpdatePanel>
                <br />
                <asp:UpdatePanel runat="server" ID="EditPanel" UpdateMode="Conditional">
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="SubmitAdd" EventName="Click" />
                    </Triggers>
                    <ContentTemplate>
                        <asp:Table runat="server" ID="EditTable" CssClass="formtable">
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="2">
                                    ویرایش برند:
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">
                                    نام:
                                </asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:TextBox runat="server" ID="EditName" CssClass="rtlinput" Width="250px"></asp:TextBox>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">
                                    کد ژنریک:
                                </asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:TextBox runat="server" ID="EditCode" CssClass="ltrinput" Width="100px"></asp:TextBox>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">
                                    نام ژنریک:
                                </asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:TextBox runat="server" ID="EditGName" CssClass="ltrinput" Width="250px" Enabled="false"></asp:TextBox>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">&nbsp;</asp:TableCell>
                                <asp:TableCell runat="server">
                                    <asp:Label runat="server" ID="EditErrMsg" ForeColor="Red"></asp:Label>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server">&nbsp;</asp:TableCell>
                                <asp:TableCell runat="server" CssClass="buttoncell">
                                    <asp:Button runat="server" ID="SubmitEdit" Text="ارسال" OnClick="DoEdit" Enabled="false" />
                                </asp:TableCell>
                            </asp:TableRow>
                        </asp:Table>
                    </ContentTemplate>
                </asp:UpdatePanel>
                <br />
                <asp:UpdatePanel runat="server" ID="QueryPanel" UpdateMode="Conditional">
                    <ContentTemplate>
                        <asp:Table runat="server" ID="QueryTable" CssClass="formtable">
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="3">
                                    جستجوی برندها:
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" Width="20px">
                                    نام:
                                </asp:TableCell>
                                <asp:TableCell runat="server" Width="150px">
                                    <asp:TextBox runat="server" ID="QueryName" CssClass="rtlinput" Width="250px"></asp:TextBox>
                                </asp:TableCell>
                                <asp:TableCell runat="server" CssClass="buttoncell">
                                    <asp:Button runat="server" ID="SubmitQuery" Text="ارسال" OnClick="DoQuery" />
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="3">
                                    <asp:Label runat="server" ID="QueryErrMsg" ForeColor="Red"></asp:Label>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="3">
                                    <asp:Table runat="server" ID="QueryResults" CssClass="resulttable">
                                    </asp:Table>
                                </asp:TableCell>
                            </asp:TableRow>
                        </asp:Table>
                    </ContentTemplate>
                </asp:UpdatePanel>
            </asp:TableCell>
            <asp:TableCell runat="server">
                انتخاب کدهای ژنریک:<br />
                <br />
                <asp:UpdatePanel runat="server" ID="GQueryPanel" UpdateMode="Conditional">
                    <ContentTemplate>
                        <asp:Table runat="server" ID="GQueryTable" CssClass="formtable">
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="3">
                                جستجوی کدها:
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" Width="20px">
                                نام:
                                </asp:TableCell>
                                <asp:TableCell runat="server" Width="150px">
                                    <asp:TextBox runat="server" ID="GQueryName" CssClass="ltrinput" Width="250px"></asp:TextBox>
                                </asp:TableCell>
                                <asp:TableCell runat="server" CssClass="buttoncell">
                                    <asp:Button runat="server" ID="GSubmitQuery" Text="ارسال" OnClick="DoGQuery" />
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="3">
                                    <asp:Label runat="server" ID="GQueryErrMsg" ForeColor="Red"></asp:Label>
                                </asp:TableCell>
                            </asp:TableRow>
                            <asp:TableRow runat="server">
                                <asp:TableCell runat="server" ColumnSpan="3">
                                    <asp:Table runat="server" ID="GQueryResults" CssClass="resulttable">
                                    </asp:Table>
                                </asp:TableCell>
                            </asp:TableRow>
                        </asp:Table>
                    </ContentTemplate>
                </asp:UpdatePanel>
            </asp:TableCell>
        </asp:TableRow>
    </asp:Table>
</asp:Content>
在Re_CreateGQueryResults()子例程中添加了动态添加/编辑按钮。如您所见,我已经添加了两条MsgBox语句,单击动态添加按钮时会显示“A”,单击动态编辑按钮时会显示“E”。问题就在这里:当我点击一个动态添加按钮时,MsgBox(“a”)可以工作,但只是第一次!进一步的单击不会导致任何进一步的消息框(并且不会对AddName、AddCode、AddGName的内容进行任何更改),并且其他动态编辑按钮在会话到期之前(例如,在ASP.NET Development Server上重新生成)也不会工作。第一次单击动态编辑按钮时也会发生类似的行为(没有其他消息框,编辑按钮和添加按钮都没有)

问题在哪里

编辑:


我解决了这个问题,将页面加载代码移动到page init事件,并将每个动态添加和编辑按钮的AsyncPostBackTriggers添加到GQueryPanel的触发器集合中(尽管Microsoft明确表示这不起作用;但对我有效!)。现在,还有另一个问题:submitforadd()和submitforedit()子例程不能按预期工作。在此之前,在第一次单击时,AddCode和AddGName文本框会获取它们的值,这些值会显示在浏览器上。但现在,它们总是空的。我测试了代码是否运行,itm变量是否正确加载了它的数据。我相信这些文本框接受了它们的值,但它们在进入浏览器的过程中消失了!有人能解释一下原因吗?

我通过将页面加载代码移动到page init事件,并为GQueryPanel的触发器集合中的每个动态添加和编辑按钮添加AsyncPostBackTriggers,解决了这个问题(尽管Microsoft明确表示这不起作用;但对我有效!)。这就是确切的代码差异:

In:Re_CreateGQueryResults()

以及:


关于

因为你有一个新的问题,请考虑将你的解决方案作为一个答案输入,然后标记为接受。您应该为新问题创建一个新问题。
Public Class EditBrands
    Inherits System.Web.UI.Page

    Private Sub Re_CreateQueryResults(ByVal dbc As SqlConnection)
        Dim qry As Base.Brands = Base.Brand.QueryBrands(dbc, Session("BrandQueryVal"))
        Dim i As Integer
        Dim tr As TableRow
        Dim tc As TableCell
        Dim bt As Button

        QueryResults.Rows.Clear()
        tr = New TableRow
        tc = New TableCell
        tc.Text = "شناسه"
        tc.CssClass = "resulttableordercol"
        tr.Cells.Add(tc)
        tc = New TableCell
        tc.Text = "نام"
        tc.CssClass = "resulttabledatacol"
        tr.Cells.Add(tc)
        tc = New TableCell
        tc.Text = "ویرایش"
        tc.CssClass = "resulttableordercol"
        tr.Cells.Add(tc)
        QueryResults.Rows.Add(tr)
        For i = 0 To qry.Count - 1
            tr = New TableRow
            tc = New TableCell
            tc.Text = qry(i).ID
            tc.CssClass = "resulttableordercol"
            tr.Cells.Add(tc)
            tc = New TableCell
            tc.Text = qry(i).Name
            tc.CssClass = "resulttabledatacol"
            tr.Cells.Add(tc)
            tc = New TableCell
            bt = New Button
            bt.Text = "ویرایش"
            bt.ID = "SubmitEdit" & qry(i).ID
            AddHandler bt.Click, AddressOf SubmitForEdit
            tc.Controls.Add(bt)
            tc.CssClass = "resulttableordercol"
            tr.Cells.Add(tc)
            QueryResults.Rows.Add(tr)
        Next
        If qry.Count = 0 Then
            QueryErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOTHINGFOUND")
            QueryResults.Rows.Clear()
        End If
    End Sub

    Private Sub Re_CreateGQueryResults(ByVal dbc As SqlConnection)
        Dim qry As StatBookManager.GenericNames = StatBookManager.GenericName.QueryGenericNames(dbc, Session("GenericQueryVal3"))
        Dim i As Integer
        Dim tr As TableRow
        Dim tc As TableCell
        Dim bt As Button

        GQueryResults.Rows.Clear()
        tr = New TableRow
        tc = New TableCell
        tc.Text = "کد"
        tc.CssClass = "resulttableordercol"
        tr.Cells.Add(tc)
        tc = New TableCell
        tc.Text = "نام"
        tc.CssClass = "resulttabledatacol"
        tr.Cells.Add(tc)
        tc = New TableCell
        tc.Text = "انتخاب برای"
        tc.ColumnSpan = 2
        tc.CssClass = "resulttableordercol"
        tr.Cells.Add(tc)
        GQueryResults.Rows.Add(tr)
        For i = 0 To qry.Count - 1
            tr = New TableRow
            tc = New TableCell
            tc.Text = qry(i).Code
            tc.CssClass = "resulttableordercol"
            tr.Cells.Add(tc)
            tc = New TableCell
            tc.Text = qry(i).Name
            tc.CssClass = "resulttabledatacolltr"
            tr.Cells.Add(tc)
            tc = New TableCell
            bt = New Button
            bt.Text = "افزودن"
            bt.ID = "SubmitForAdd" & qry(i).ID
            AddHandler bt.Click, AddressOf SubmitGForAdd
            ScriptManager.GetCurrent(Me.Page).RegisterAsyncPostBackControl(bt)
            tc.Controls.Add(bt)
            tc.CssClass = "resulttableordercol"
            tr.Cells.Add(tc)
            tc = New TableCell
            bt = New Button
            bt.Text = "ویرایش"
            bt.ID = "SubmitForEdit" & qry(i).ID
            AddHandler bt.Click, AddressOf SubmitGForEdit
            ScriptManager.GetCurrent(Me.Page).RegisterAsyncPostBackControl(bt)
            tc.Controls.Add(bt)
            tc.CssClass = "resulttableordercol"
            tr.Cells.Add(tc)
            GQueryResults.Rows.Add(tr)
        Next
        If qry.Count = 0 Then
            GQueryErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOTHINGFOUND")
            GQueryResults.Rows.Clear()
        Else
            GQueryErrMsg.Text = ""
        End If
    End Sub

    Protected Sub DoGQuery(ByVal sender As Object, ByVal e As EventArgs)
        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))

        GQueryErrMsg.Text = ""
        If GQueryName.Text.Trim = "" Then
            GQueryErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOGENERICNAME")
            dbc.Close()
            Exit Sub
        End If

        Session("GenericQueryVal3") = GQueryName.Text
        Re_CreateGQueryResults(dbc)
        dbc.Close()
    End Sub

    Protected Sub SubmitGForAdd(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("A")
        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))
        Dim itm As New StatBookManager.GenericName(dbc, Val(CType(sender, Button).ID.Substring(12)), StatBookManager.GenericName.IdentifyBy.ID)

        AddCode.Text = itm.Code
        AddGName.Text = itm.Name
        AddPanel.Update()
        dbc.Close()
    End Sub

    Protected Sub SubmitGForEdit(ByVal sender As Object, ByVal e As EventArgs)
        MsgBox("E")
        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))
        Dim itm As New StatBookManager.GenericName(dbc, Val(CType(sender, Button).ID.Substring(13)), StatBookManager.GenericName.IdentifyBy.ID)

        EditCode.Text = itm.Code
        EditGName.Text = itm.Name
        EditPanel.Update()
        dbc.Close()
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            If Session("GenericQueryVal3") IsNot Nothing Then
                Session.Remove("GenericQueryVal3")
                Exit Sub
            End If
        End If

        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))

        If Page.IsPostBack AndAlso (Session("BrandQueryVal") IsNot Nothing) AndAlso (AJAXUtils.GetAsyncPostBackControlID(Me.Page).EndsWith("$QueryPanel")) Then
            Re_CreateQueryResults(dbc)
            If QueryName.Text = "" Then QueryName.Text = Session("BrandQueryVal")
        End If
        If Page.IsPostBack AndAlso (Session("GenericQueryVal3") IsNot Nothing) AndAlso (AJAXUtils.GetAsyncPostBackControlID(Me.Page).EndsWith("$GQueryPanel")) Then
            Re_CreateGQueryResults(dbc)
            If GQueryName.Text = "" Then GQueryName.Text = Session("GenericQueryVal3")
        End If
        dbc.Close()
    End Sub

    Protected Sub DoAdd(ByVal sender As Object, ByVal e As EventArgs)
        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))

        AddErrMsg.Text = ""
        If AddName.Text.Trim = "" Then
            AddErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOBRANDNAME")
            dbc.Close()
            Exit Sub
        End If
        If AddCode.Text.Trim = "" Then
            AddErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOGENERICCODE")
            dbc.Close()
            Exit Sub
        End If

        Dim itm As New Base.Brand

        If Not itm.GenericName.Load(dbc, Val(AddCode.Text), StatBookManager.GenericName.IdentifyBy.Code) Then
            AddErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "GENERICNOTFOUND")
            dbc.Close()
            Exit Sub
        End If

        itm.Name = AddName.Text
        itm.Register(dbc)
        AddName.Text = ""
        AddCode.Text = ""
        AddGName.Text = ""
        EditName.Text = ""
        EditCode.Text = ""
        EditGName.Text = ""
        SubmitEdit.Enabled = False
        dbc.Close()
    End Sub

    Protected Sub DoEdit(ByVal sender As Object, ByVal e As EventArgs)
        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))
        Dim itm As New Base.Brand(dbc, Session("BrandEditID"))

        EditErrMsg.Text = ""
        If EditName.Text.Trim = "" Then
            EditErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOBRANDNAME")
            dbc.Close()
            Exit Sub
        End If
        If EditCode.Text.Trim = "" Then
            EditErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOGENERICCODE")
            dbc.Close()
            Exit Sub
        End If
        If Not itm.GenericName.Load(dbc, Val(EditCode.Text), StatBookManager.GenericName.IdentifyBy.Code) Then
            EditErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "GENERICNOTFOUND")
            dbc.Close()
            Exit Sub
        End If

        itm.Name = EditName.Text
        itm.Save(dbc)
        EditName.Text = ""
        EditCode.Text = ""
        EditGName.Text = ""
        SubmitEdit.Enabled = False
        Re_CreateQueryResults(dbc)
        QueryPanel.Update()
        dbc.Close()
    End Sub

    Protected Sub DoQuery(ByVal sender As Object, ByVal e As EventArgs)
        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))

        QueryErrMsg.Text = ""
        If QueryName.Text.Trim = "" Then
            QueryErrMsg.Text = SystemSys.SysMan.GetSystemMessage(dbc, "NOBRANDNAME")
            dbc.Close()
            Exit Sub
        End If

        Session("BrandQueryVal") = QueryName.Text
        Re_CreateQueryResults(dbc)
        dbc.Close()
    End Sub

    Protected Sub SubmitForEdit(ByVal sender As Object, ByVal e As EventArgs)
        Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))
        Dim itm As New Base.Brand(dbc, Val(CType(sender, Button).ID.Substring(10)))

        Session("BrandEditID") = itm.ID
        EditName.Text = itm.Name
        EditCode.Text = itm.GenericName.Code
        EditGName.Text = itm.GenericName.Name
        SubmitEdit.Enabled = True
        EditPanel.Update()
        Re_CreateQueryResults(dbc)
        dbc.Close()
    End Sub

    Private Sub EditBrands_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        If Page.IsPostBack AndAlso (Session("GenericQueryVal3") IsNot Nothing) Then
            Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))

            Re_CreateGQueryResults(dbc)
            dbc.Close()
        End If
    End Sub
End Class
...
        Dim trg as AsyncPostBackTrigger
...
        For i = 0 To qry.Count - 1
...
            AddHandler bt.Click, AddressOf SubmitGForAdd
            trg = New AsyncPostBackTrigger
            trg.ControlID = bt.ID
            trg.EventName = "Click"
            GQueryPanel.Triggers.Add(trg)
...
            AddHandler bt.Click, AddressOf SubmitGForEdit
            trg = New AsyncPostBackTrigger
            trg.ControlID = bt.ID
            trg.EventName = "Click"
            GQueryPanel.Triggers.Add(trg)
...
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    If Not Page.IsPostBack Then
        If Session("GenericQueryVal3") IsNot Nothing Then
            Session.Remove("GenericQueryVal3")
            Exit Sub
        End If
    End If

    Dim dbc As SqlConnection = Connectivity.GetConnectionToDB(Session("DatabaseName"))

    If Page.IsPostBack AndAlso (Session("BrandQueryVal") IsNot Nothing) AndAlso (AJAXUtils.GetAsyncPostBackControlID(Me.Page).EndsWith("$QueryPanel")) Then
        Re_CreateQueryResults(dbc)
        If QueryName.Text = "" Then QueryName.Text = Session("BrandQueryVal")
    End If
    If Page.IsPostBack AndAlso (Session("GenericQueryVal3") IsNot Nothing) AndAlso (AJAXUtils.GetAsyncPostBackControlID(Me.Page).EndsWith("$GQueryPanel")) Then
        Re_CreateGQueryResults(dbc)
        If GQueryName.Text = "" Then GQueryName.Text = Session("GenericQueryVal3")
    End If
    dbc.Close()
End Sub