首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >动态事件处理程序不触发

动态事件处理程序不触发
EN

Stack Overflow用户
提问于 2013-10-25 11:39:53
回答 2查看 7.7K关注 0票数 4

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

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

编辑

我删除了我最初发布的代码,因为否则这个帖子就太长了。

我要发布我的全部.aspx代码和后面的代码,所以你们知道这正是我所看到的。同样,当在代码中更改文本时,由此代码生成的动态TextBox不会触发绑定到它的事件处理程序,因此它就会消失。有趣的是-我认为当您更改文本时确实会发生回发,但它不会触发事件处理程序.

ASPX前端:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ 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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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从页面中消失.再次感谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-25 12:13:48

由于ViewState的存在,动态控件可能有点棘手。

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ 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时,每次回发到服务器时,您都在(1)将整个ViewState加上表单数据上载到服务器,(2)重建整个页面(解析ViewState、呈现ViewState等等)。在服务器上,和(3)将所有的HTML (和ViewState)发送回客户机。这对于使用电力和数据计划费率的移动设备来说尤其麻烦。

票数 3
EN

Stack Overflow用户

发布于 2013-10-25 19:07:51

您需要将动态文本框的AutoPostback属性设置为True,以便它们触发TextChanged事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
    MyBase.OnInit(e)

    For i As Int16 = 0 To 5
        Dim txtTest As New TextBox
        txtTest.Text = "this is an OnInit generated textbox"
        txtTest.ID = "testOnInit" + i.ToString
        txtTest.AutoPostBack = True  
        Form.Controls.Add(txtTest)
        AddHandler txtTest.TextChanged, AddressOf txtTest_TextChanged
    Next
End Sub

Protected Sub txtTest_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim txt As TextBox = DirectCast(sender, TextBox)
    lblTest.Text = txt.ID & " value changed to " & txt.Text
End Sub
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19598141

复制
相关文章
打印宝石
/* 功能:打印宝石 日期:2013-05-08 */ #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { int line,count; for(line = 1;line<=3;line++) { for (count=3;count<=7-2*(line-1);count+=2) { printf(" "); } for (count=1;count<=2*line-1;count+=1) { printf("*"); } printf("n"); } for (line = 1;line<=5;line++) { for(count=1;count<line;count++) { printf(" "); } for(count=1;count<=7-2*(line-1);count++) { printf("*"); } printf("n"); } printf("n"); system("pause"); return 0; }
WindCoder
2018/09/20
3450
1625: [Usaco2007 Dec]宝石手镯
1625: [Usaco2007 Dec]宝石手镯 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 919  Solved: 618 [Submit][Status] Description 贝茜在珠宝店闲逛时,买到了一个中意的手镯。很自然地,她想从她收集的 N(1 <= N <= 3,402)块宝石中选出最好的那些镶在手镯上。对于第i块宝石,它的重量为W_i(1 <= W_i <= 400),并且贝茜知道它在镶上手镯后能为自己增加的魅力值D_i(1 <=
HansBug
2018/04/10
5730
宝石与石头
给定字符串J代表石头中宝石的类型,和字符串S代表你拥有的石头。S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。 J中的字母不重复,J和S中的所有字符都是字母。字母区分大小写,因此a和A是不同类型的石头。
WindRunnerMax
2020/10/10
3110
【Unity】瞎做个宝石迷阵吧!(3)——宝石消除
啊,终于来到了接近尾声的地方了。上次写到我们完成了宝石的交换,接下来我们就要对宝石的消除进行判断并实现消除。那赶紧进入正题吧。
ZifengHuang
2020/07/29
7740
【Unity】瞎做个宝石迷阵吧!(3)——宝石消除
PHP SPL他们留下的宝石
Rafael Dohms 上面的篇文章 让我为之惊艳。忍不住就翻译了下来。同一时候补充了部分内容。
全栈程序员站长
2022/01/04
4490
PHP SPL他们留下的宝石
不同组织的窗宽窗位
垂体及蝶鞍区病:变窗宽宜设在200 Hu~250 Hu,窗位45 Hu~50 Hu,
全栈程序员站长
2022/06/24
7630
DICOM影像中的窗宽窗位
医学图像领域的关键技术窗技术,是CT检查中用以观察不同密度的正常组织或病变的一种显示技术,包括窗宽(window width)和窗位(window level)。由于各种组织结构或病变具有不同的CT值,因此想要显示某一组织结构细节时,应该选择适合观察该组织或病变的窗宽和窗位,以获得最佳显示。
全栈程序员站长
2022/09/07
1.5K0
Python | 宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
算法与编程之美
2021/05/31
3280
Python | 宝石与石头
771.宝石与石头
题目:给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
暮雨
2019/09/17
3960
771.宝石与石头
771. 宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
Michel_Rolle
2021/02/25
2.5K0
Hive鲜为人知的宝石-Hooks
Hive为Hadoop提供了一个SQL接口。Hive可以被认为是一种编译器,它将SQL(严格来说,Hive查询语言 - HQL,SQL的一种变体)转换为一组Mapreduce / Tez / Spark作业。因此,Hive非常有助于非程序员使用Hadoop基础架构。原来,Hive只有一个引擎,即MapReduce。但是在最新版本中,Hive还支持Spark和Tez作为执行引擎。这使得Hive成为探索性数据分析的绝佳工具。
Spark学习技巧
2020/07/31
2.7K0
Hive鲜为人知的宝石-Hooks
你的Api接口上锁了吗?
职责单一化,各司其职,后端只负责Api接口编写提供给各种不同类型的客户端去调用,但是客户端和服务器端调用是要有权限限制的,不能任何一个客户端都可以随便调用我们的接口(这里面的缘由相信大家都知道吧,当然我就默认你们都知道),再者我们都知道http是明文传输,被抓包可可以修改相应参数,当然如果你使用了https就相对安全了不少!
思梦php
2018/10/08
6630
你的Api接口上锁了吗?
窗函数
 数字信号处理中通常是取其有限的时间片段进行分析,而不是对无限长的信号进行测量和运算。具体做法是从信号中截取一个时间片段,然后对信号进行傅里叶变换、相关分析等数学处理。信号的截断产生了能量泄漏,而用FFT算法计算频谱又产生了栅栏效应,从原理上讲这两种误差都是不能消除的。在FFT分析中为了减少或消除频谱能量泄漏及栅栏效应,可采用不同的截取函数对信号进行截短,截短函数称为窗函数,简称为窗。
AIHGF
2019/02/18
1.5K0
窗函数
JetBrains IDE 中的隐藏宝石技巧
在日常使用 Goland 时,团队收集了一些可以帮助我们专注于创造的同时减少重复工作的小技巧。如果你是在 IDEA 中使用的 Go 插件,或者其他 IntelliJ 的产品,同样也有这些特性。
crossoverJie
2022/10/27
5440
JetBrains IDE 中的隐藏宝石技巧
云钓鱼:新伎俩和“皇冠上的宝石”
云计算为网络钓鱼者提供了一个收获和发展业务的新平台。不仅如此,其影响也更为广泛、危险。任何组织,无论大小,都不可避免地会受到网络钓鱼攻击的伤害。因此,了解攻击是如何发生的以及如何预防可谓至关重要。 基于SaaS的网络钓鱼已经十分普遍。例如,数据显示超过90%的数据泄露都归咎于网络钓鱼,手段更是层出不穷,从被盗的凭据到恶意链接等等。此外,根据Palo Alto Networks发布的一份报告指出,研究人员发现网络钓鱼攻击正在大幅增加,该公司收集的数据显示,从2021年6月到2022年6月,这种攻击大幅增长了1
FB客服
2023/02/24
8290
云钓鱼:新伎俩和“皇冠上的宝石”
LeetCode 771. 宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
freesan44
2021/12/06
3090
12—宝石与石头【LeetCode771】
给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
吃猫的鱼Code
2023/08/09
1090
飘窗效果
第一种实现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>浮窗效果</title> <style> * {
Spaceack
2020/11/04
6670
LeetCode LCP 50. 宝石补给
每位勇者初始都拥有一些能量宝石, gem[i] 表示第 i 位勇者的宝石数量。 现在这些勇者们进行了一系列的赠送,operations[j] = [x, y] 表示在第 j 次的赠送中 第 x 位勇者将自己一半的宝石(按需向下取整)赠送给第 y 位勇者。
Michael阿明
2022/05/10
2140
PHP SPL 被遗落的宝石【SPL应用浅析】
Rafael Dohms 上面的篇文章 让我为之惊艳,忍不住就翻译了下来,同时补充了部分内容。
用户8664418
2021/07/13
6510

相似问题

iOS密钥链问题。由于SecItemCopyMatching(),SecKeyRef始终为null

30

Xcode 8.3“指定的密钥链不是有效的密钥链文件。

11

iOS密钥链,存储更多kSecValueData项

12

没有有效的xcode密钥链

10

提供的密钥不是有效的Google密钥

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文