簡體   English   中英

動態添加的按鈕單擊事件僅觸發一次

[英]Dynamically added button click event fire only once

好吧,這似乎是一個重復的老問題,但是我找不到任何解決方案。 我正在編寫一個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>

以及后面的代碼:

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

動態添加/編輯按鈕添加在Re_CreateGQueryResults()子例程中。 如您所見,我添加了兩個MsgBox語句,當單擊動態添加按鈕時,它們表示“ A”,而單擊動態編輯按鈕時,則表示“ E”。 問題正好在這里:當我單擊動態添加按鈕時,MsgBox(“ A”)有效,但僅適用於第一個! 再次單擊不會導致任何其他消息框(並且不會導致AddName,AddCode,AddGName的內容發生任何變化),並且其他動態編輯按鈕在會話期滿(例如,在ASP上重建)之前也無法正常工作。 NET開發服務器)。 第一次單擊動態編輯按鈕時,會發生類似的行為(沒有其他消息框,既沒有通過編輯按鈕也沒有通過添加按鈕)。

問題出在哪兒?

編輯:

我通過將頁面加載代碼移動到頁面初始化事件並為GQueryPanel的Triggers集合中的每個動態添加和編輯按鈕添加AsyncPostBackTriggers來解決了此問題(盡管Microsoft明確表示這行不通;但對我有用!)。 現在,還有另一個問題:SubmitGForAdd()和SubmitGForEdit()子例程無法按預期工作。 在此之前,第一次單擊時,AddCode和AddGName文本框將使用其值,並且這些值將顯示在瀏覽器上。 但是現在,它們始終是空的。 我測試了代碼是否運行並且itm變量正確加載了數據。 我相信這些文本框具有其價值,但在瀏覽器中卻消失了! 誰能解釋為什么?

我通過將頁面加載代碼移動到頁面初始化事件並為GQueryPanel的Triggers集合中的每個動態添加和編輯按鈕添加AsyncPostBackTriggers來解決了此問題(盡管Microsoft明確表示這行不通;但對我有用!)。 這是確切的代碼差異:

在:Re_CreateGQueryResults()

...
        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

問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM