我遇到了按钮和 AddHandler 的问题。仅当我在 Page_load 中使用 AddHandler Button1.click, AddressOf... 时它才有效,但如果我在子例程之一中动态创建按钮,则该事件不会触发。
例如,
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True">
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
</asp:DropDownList>
<asp:ScriptManager id="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel id="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="False">
<contenttemplate>
<asp:PlaceHolder id="PlaceHolder1" runat="server"></asp:PlaceHolder>
</contenttemplate>
</asp:UpdatePanel>
<asp:UpdatePanel id="UpdatePanel2" runat="server" UpdateMode="Conditional">
<contenttemplate>
<asp:Label id="Label2" runat="server" Text="Label"></asp:Label>
</contenttemplate>
</asp:UpdatePanel>
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
Label1.Text = Date.Now
ScriptManager1.RegisterAsyncPostBackControl(DropDownList1)
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Label2.Text = "Panel refreshed at " + Date.Now.ToString()
End Sub
Protected Sub DropDownList1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DropDownList1.SelectedIndexChanged
Dim b As New Button
b.Text = "Click"
ScriptManager1.RegisterAsyncPostBackControl(b)
AddHandler b.Click, AddressOf Button1_Click
PlaceHolder1.Controls.Add(b)
UpdatePanel1.Update()
End Sub
下拉列表有效,但按钮无效。我究竟做错了什么?
您必须在每次回发时重新生成动态创建的控件(最后在 Page_Load 中,在 Page_Init 中更好)。您必须相应地设置控件的 ID,因为 ASP.Net 需要它来识别哪个控件导致回发并处理适当的事件。
您可以在 ViewState 中保存创建的按钮数量,并使用它在 Page_Load 上重新生成它们。添加新按钮时增加数字。使用此数字还可以使按钮的 ID 唯一(将其附加到 ID),以确保每次回发时都相同。
欲了解更多信息,请查看页面生命周期 and 具有动态添加控件的 ViewState.
编辑:正如 Joel 所评论的,如果您只需要一个按钮,您可以静态设置它的 ID,但您必须在回发时重新生成它。处理它的点击事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)