【发布时间】:2013-10-25 19:39:53
【问题描述】:
我想根据用户在文本框中输入的数字动态创建一定数量的控件。这部分我工作得很好,但我还需要动态创建的文本框有自己的事件处理程序,这样用户就可以在其中输入一个数字,并创建更多的控件。
我的问题是我为这些控件设置的事件处理程序没有触发。也许我没有正确理解 ASP.NET 页面生命周期,但我目前正在 OnInit 事件中生成动态控件(在我在第一个文本框的 TextChanged 事件中生成它们之前,但切换到使用 OnInit事件基于我在这里找到的 Oded 的建议:Dynamically Added Event Handler Not Firing)。
编辑
我删除了我最初发布的代码,否则这篇文章会太长。
我将在此处发布我的整个 .aspx 代码和后面的代码,所以你们知道这正是我正在查看的内容。同样,由此代码生成的动态 TextBox,当其中的文本发生更改时,不会触发绑定到它的事件处理程序,它只是消失了。值得注意的是 - 我认为当您更改文本时确实会发生回发,但它不会触发事件处理程序......
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 从页面中消失...谢谢再次求助!
【问题讨论】:
-
这段代码应该可以正常工作。您确定循环是迭代的并且您在相应的文本框中执行任何更改(并验证它)吗?
-
是的 - 我已经通过循环,通过,生成文本框,但是当我更改任何这些文本框中的文本时,它们的 textChanged 事件(这是我代码中的上述事件) , 不开火。动态文本框显示在页面上……只是它们的事件处理程序没有触发。
-
请记住,在 ASP 中,行为与在 Winforms 中不同。此事件仅在更改发布到服务器(msdn.microsoft.com/en-us/library/…)时触发,例如,当用户按下回车时。
-
您的事件添加部分很好。不工作的唯一原因是没有被调用(或者从错误的地方被调用,正如没有必要的那样,有点悲伤的尼克,顺便说一句:));或者你没有做正确的检查。
-
我应该澄清一下 - 显然,我不希望 textChanged 事件处理程序触发,除非用户更改控件中的文本,此时它会返回服务器调用事件处理程序。
标签: asp.net vb.net event-handling page-lifecycle dynamic-controls