gpt4 book ai didi

asp.net - 动态事件处理程序未触发

转载 作者:行者123 更新时间:2023-12-04 02:42:25 24 4
gpt4 key购买 nike

我想根据用户在文本框中输入的数字动态创建一定数量的控件。这部分我工作得很好,但我还需要动态创建的文本框有自己的事件处理程序,这样用户就可以在其中输入一个数字,并创建更多的控件。

我的问题是我为这些控件设置的事件处理程序不会触发。也许我没有正确理解 ASP.NET 页面生命周期,但我目前正在 OnInit 事件中生成动态控件(在我在第一个文本框的 TextChanged 事件中生成它们之前,但切换到使用 OnInit事件基于我在这里找到的 Oded 的建议:Dynamically Added Event Handler Not Firing)。

编辑

我删除了我最初发布的代码,因为否则这篇文章会太长。

我将在此处发布我的整个 .aspx 代码和后面的代码,所以你们知道这正是我正在查看的内容。同样,由此代码生成的动态 TextBox,当其中的文本发生更改时,不会触发绑定(bind)到它的事件处理程序,它只是消失了。值得注意的是 - 我认为当您更改文本时确实会发生回发,但它不会触发事件处理程序......

ASPX 前端:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div id="dynamicControlDiv">
<asp:Label ID="lblEnter" runat="server" Text="Enter the amount of textboxes you want:"></asp:Label>
<asp:TextBox ID="txtEnter" runat="server" AutoPostBack="true"></asp:TextBox>
<asp:Label ID="lblConfirm" runat="server" Text=""></asp:Label>
</div>
</form>
</body>
</html>

隐藏代码:

部分类 _Default
继承 System.Web.UI.Page
Dim numOfDesiredControls As Int16

Protected Sub txtEnter_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtEnter.TextChanged

Try
numOfDesiredControls = Convert.ToInt16(txtEnter.Text)
If Not numOfDesiredControls = 0 Then
For i As Int16 = 1 To numOfDesiredControls
Dim txtTest As New TextBox
txtTest.Text = "dynamicTextBox"
txtTest.ID = "dynamicTextBox" + i.ToString
txtTest.AutoPostBack = True
Form.Controls.Add(txtTest)
AddHandler txtTest.TextChanged, AddressOf dynamicEventHandler
Next
End If
Catch ex As Exception

End Try
End Sub

Protected Sub dynamicEventHandler(ByVal sender As Object, ByVal e As System.EventArgs)
' If the event handler gets fired, reflect this by changing the text of lblConfirm
lblConfirm.Visible = True
lblConfirm.Text = "Event handler fired!"
End Sub

End Class

尝试使用此代码制作您自己的项目,看看您是否遇到与我相同的问题 - 动态创建的 TextBox 发回,但不会触发其事件处理程序,然后 TextBox 从页面中消失...再次感谢您帮助!

最佳答案

由于ViewState,动态控制可能有点棘手。

基本上:您正在添加动态控件以响应 TextChanged事件,在 Init 之后触发和 LoadViewState 之后被反序列化了。因此,您遇到问题是因为 ViewState不了解动态控件,并且与您的期望不同步。通过检查 txtEnter.Text 的值在 Load阶段并在那里创建控件,您可以使您的ViewState知道控件(记住,每次页面加载时都会创建这些控件!),因此您的 dynamicEventHandler现在有一个可以从中执行的上下文。

这是更正后的代码(但为简单起见,作为带有嵌入式 VB 的单个文件,您当然可以将其分离到代码隐藏文件中):

<%@ Page Language="VB" AutoEventWireup="false" %>

<script runat="server">
Dim numOfDesiredControls As Int16

Protected Sub Page_Load() Handles form1.Load

Try
numOfDesiredControls = Convert.ToInt16(txtEnter.Text)
If Not numOfDesiredControls = 0 Then
For i As Int16 = 1 To numOfDesiredControls
Dim txtTest As New TextBox
txtTest.Text = "dynamicTextBox"
txtTest.ID = "dynamicTextBox" + i.ToString
txtTest.AutoPostBack = True
' txtTest.EnableViewState = False
Form.Controls.Add(txtTest)
AddHandler txtTest.TextChanged, AddressOf dynamicEventHandler
Next
End If
Catch ex As Exception

End Try
End Sub

Protected Sub dynamicEventHandler(ByVal sender As Object, ByVal e As System.EventArgs)
' If the event handler gets fired, reflect this by changing the text of lblConfirm
Dim txt As TextBox
txt = CType(sender, TextBox)
lblConfirm.Visible = True
lblConfirm.Text = "Event handler " + txt.Id + " fired: " + txt.Text ' append ID and text so we know which one fired it.
End Sub
</script>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div id="dynamicControlDiv">
<asp:Label ID="lblEnter" runat="server" Text="Enter the amount of textboxes you want:"></asp:Label>
<asp:TextBox ID="txtEnter" runat="server" AutoPostBack="true"></asp:TextBox>
<asp:Label ID="lblConfirm" runat="server" Text=""></asp:Label>
</div>
</form>
</body>
</html>

这是 Msft 关于解释行为的动态控件的起点。这方面有很多资源。

http://msdn.microsoft.com/en-us/library/hbdfdyh7.aspx

专业提示:如果可以,请不要使用动态控件。虽然这可以说是支持不使用 JavaScript 的浏览器的一种不错的方式,但目前首选的方法是使用 JavaScript 动态构建控件并使用 AJAX 进行更新。否则,您发送的数据比您需要的多。当您使用 PostBack , 每次您 POST 回服务器时,您 (1) 都会上传整个 ViewState将表单数据添加到服务器,(2) 在服务器上重建整个页面(解析 ViewState ,呈现 HTML 等),以及 (3) 将所有 HTML(和 ViewState )发送回客户端。这对于适用电源使用和数据计划费率的移动设备来说尤其麻烦。

关于asp.net - 动态事件处理程序未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19598141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com