![](/img/trans.png)
[英]Dynamically added Link Button doesn't fire the on click event on the first click - C#
[英]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"> </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"> </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"> </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"> </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.