如果事件处理程序不存在,则以编程方式在 VB.NET 中添加事件处理程序

2024-04-10

我正在尝试对 ASP.NET 网页中的多个控件使用单个事件处理程序。当且仅当事件处理程序尚不存在时,我想在运行时添加事件处理程序。在 C# 中,我将如下所示编写:

if (myTextBox.OnTextChanged == null)
{
    myTextBox.OnTextChanged += DoTextChangingValidation;
}

同样,我知道我可以删除事件处理程序,如下所示:

if (myTextBox.OnTextChanged != null)
{
    myTextBox.OnTextChanged -= DoTextChangingValidation;
}

我知道如何在 Visual Basic 中添加和删除事件处理程序...但是我如何弄清楚如何检查它是否已分配?


无论是在 C# 中还是在 Visual Basic 中,都无法从对象外部执行此操作。一个事件基本上是两个访问器:add and remove。如果您手动编码,这将立即可见:

public event EventHandler Click
{
     add { ... }
     remove { ... }
}

这些成为add_Click(EventHandler) and remove_Click(EventHandler)方法。即使您使用默认事件实现,

public event EventHandler Click;

它仍然没有什么不同,只是访问器是使用默认实现为您生成的,该实现使用与事件同名的私有多播委托字段来存储这些处理程序。

这意味着两件事:

  1. 对于班级的客户来说,他们对事件唯一能做的两件事是add or remove处理程序,因为只有访问器被公开。没有访问器来列出当前注册的处理程序

  2. 即使您使用事件的默认实现(它提供了一个字段),该字段仍然是私有的,因此您无法访问它,除非从同一类的方法内部访问。如果您有代码权限,则可以使用反射,但请参阅#1 了解为什么它不是通用解决方案。

这实际上是故意的。原因是这样的:该对象可能是共享的,并且其他代码可能已经为其事件注册了其处理程序。如果您有权访问处理程序列表,您就可以自己调用它们,这可能会违反合同,并以类所有者不希望的方式访问私有方法。

如果您想要这种事情,则需要在提供事件的类中完成 - 要么编写您自己的add and remove检查是否存在欺骗,或通过属性公开私有字段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果事件处理程序不存在,则以编程方式在 VB.NET 中添加事件处理程序 的相关文章

  • VB SQL 语句未选择正确的行

    我试图使用 SELECT 语句在我的数据库中 选择 一个人 但它没有选择正确的人 我也不确定为什么 我正在使用访问数据库 数据库连接代码 Imports System Data OleDb Module Database Connectio
  • 打印对话框不显示在 64 位计算机上的 Crystal Report Viewer 中

    我有一个运行 Windows 2008 Server 64 位的客户端 他正在运行我们的软件 它具有内置的水晶报表查看器功能 无论如何 打印对话都行不通 它在我们的 32 位机器上运行并且我们验证了它 我在我们的 64 位机器上验证了它 打
  • 寻找领域事件的例子

    有谁知道在哪里可以找到域事件实现的示例代码 如乌迪 达汉 http www udidahan com in 领域事件 救赎 http www udidahan com 2009 06 14 domain events salvation 在
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 使用正则表达式验证器上传文件不适用于仅 Firefox IE

    我有一个带有 RegularExpressionValidator 的 FileUpload 和以下验证表达式 a zA Z 2 w w w gif jpg JPG JPEG GIF jpeg png bmp 3dm 3dmf ai drw
  • DataGridView 使用 Structure 和 LINQ 来排序 txt 文件

    当我的程序出现问题时 我能够将所有数据拉入网格并进入正确的列 行 但是 我相信我的 LINQ 查询是错误的 它没有使第三列正确划分并插入正确的数据 我的结果 https gyazo com 0f307a10dff4c015a361708ec
  • 根据所选单选按钮启用文本框

    我有一个单选按钮列表 其中列出了不同的业务类别 最后一个选项是Other类别 当用户选择Other类别 我希望能够启用一个文本框 用户可以输入更多信息来解释Other选择 目前 我正在尝试 If rblCategory SelectedIn
  • 如何使用 VB.NET 打开受密码保护的共享网络文件夹?

    我需要在网络上打开受密码保护的共享文件夹才能访问 Access 97 数据库 如何打开文件夹并输入密码 在这里找到http www mredkj com vbnet vbnetmapdrive html http www mredkj co
  • vb.net HtmlAgilityPack 在 div 之后插入字符串

    我试图在 div 末尾直接插入一些我自己的 html 这个 div 里面有其他 div Dim HtmlNode As HtmlNode HtmlNode CreateNode span class Those were the frien
  • 在 Visual Basic 中将窗体放置在屏幕右下角

    当表单加载时 如何将表单定位在屏幕的右下角 我正在使用 Visual Basic 2010 Express Thanks 编辑 我这样做了 看起来效果很好 Dim x As Integer Dim y As Integer x Screen
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P
  • 如何调试symfony2服务容器中配置的标签和服务?

    我正在编写一个服务来处理 AccessDeniedException 并且我找到了一种方法来解决它使用 Symfony2 的 AccessDeniedHandlerInterface https stackoverflow com ques
  • 从特定 IP 地址发送 SOAP 请求

    我有一个具有多个 IP 地址的系统 但我只能从一个 IP 地址发起 SOAP 请求 我如何在 VB NET 中获得它 我从来没有这样做过 看起来很复杂 首先 阅读自定义 ASMX 客户端代理的方法 http johnwsaunders3 w
  • 从字体到跨度(大小和颜色)和背面的正则表达式(VB.NET)

    我正在寻找一个正则表达式 可以将我的字体标签 仅具有大小和颜色属性 转换为具有相关内联CSS的span标签 如果有帮助的话 这将在 VB NET 中完成 我还需要一个正则表达式来实现相反的效果 下面详细说明的是我正在寻找的转换示例 font
  • 用于 C++ 数据复制的 Boost::Signals

    最近我有一堂课看起来像 class IGraphElement typedef void FuncCharPtr char int public void Add FuncCharPtr f FuncVec push back f void
  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • 有没有更简单的方法来处理复选框?

    在 vb net 中 我有一个包含一组四个复选框的表单 每个复选框都表示 选中时 用户想要向其订单添加特殊指令 代码如下所示 If SpecialInstruction1CheckBox Checked Then AddSpecialIns
  • 如何在不实现视图的情况下处理草书事件

    我正在编写一个应用程序cursive https docs rs cursive 0 16 3 cursive GUI 我想当用户按下某些键时执行某些操作 例如 当使用表格视图 https docs rs cursive table vie
  • 如何检查主音量是否静音

    如何在 Windows 7 操作系统中检查主音量是否静音我有静音或取消静音的代码 IE Public Const APPCOMMAND VOLUME MUTE As Integer H80000 Public Const APPCOMMAN
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH

随机推荐

  • Typescript:在单独的文件中定义类及其方法

    是否可以在一个文件中声明一个类并在单独的文件中定义其方法 我有一些课程a lot方法 如果我能把它们分散一点那就太好了 简短回答 Typescript 不支持将类定义拆分为多个文件 解决方法 您可以定义一个包含类成员的接口 以及两个实现该接
  • 有谁遇到过“encodeURIComponent(string)”的跨浏览器问题

    我需要动态地从一些自定义字符串值创建 URL 我有疑问encodeURIComponent string https developer mozilla org en JavaScript Reference Global Objects
  • 体系结构 x86_64 的未定义符号:GCC

    我在我的 mac pro 上安装了 gcc 5 3 0 我想使用以下命令编译 c 程序 gcc main c o matrix mcmodel medium lm 但是我收到了这个错误 Undefined symbols for archi
  • Rails 资产管道和摘要价值

    有谁知道资产消化价值到底是怎么计算的吗 如果我有两个 JS 文件 其中包含各种其他包含的 JS 脚本 那么如果内部脚本都没有更改 每个文件是否会维护相同的摘要哈希 或者每次运行 asset precompile 操作时都会计算新的摘要值 接
  • 在 RStudio 中网络抓取 VIN 号码的品牌/型号/年份

    我目前正在开展一个项目 需要查找制造商 型号和 VIN 编号年份 我有 300 个不同 VIN 号码的列表 检查每个单独的 VIN 号码并将制造商 型号和年份手动输入到 Excel 中是非常低效且乏味的 我尝试使用带有 SelectorGa
  • 不使用循环打印 1 到 1000 [重复]

    这个问题在这里已经有答案了 我在 C 编程上下文中看到这个问题 我检查了一个解决方案 我的一位朋友给了我这段代码 它工作完美 但我无法理解它的逻辑以及它是如何工作的 我向他询问了这个问题 但他也不知道该程序实际上是如何工作的 我认为他也从某
  • 如何在 Play Framework 2.0 中使用 Evolutions?

    对于 1 x 版本 我们可以使用play evolutions apply 在 play 2 0 beta 中如何做到这一点 Evolution apply 在应用程序启动时自动运行 Play 2 0 rc1 缺少的是生成进化脚本并从 SB
  • 在 RSpec 请求规范中的每个请求之前设置标头

    如何在其中设置标题before each像下面这样 RSpec describe Users API type request do before each do host example org set a header for all
  • 更新对象时出现 HibernateOptimisticLockingFailureException

    我在更新对象时遇到以下异常 HibernateOptimisticLockingFailureException 类 用户 的对象 带有标识符 25614 乐观锁定失败 嵌套异常 是 org hibernate StaleObjectSta
  • Snowflake 中具有多个 JSON 对象的横向展平数组

    我有一个包含多个 JSON 对象的数组 表中任何 JSON 数组的最大元素数为 8 这是数组原始值的示例 variants id 12388362846279 inventory quantity 10 sku sku1 id 123883
  • 是否可以从命令行运行 Smalltalk 脚本?

    我发现了一个 可能过时且不正确 2004 年的博客文章 http www ianbicking org where smalltalk went wrong html它声称不可能从命令行运行 Smalltalk 脚本 从那时起有什么变化吗
  • 在 swift 中使用 TripleDes 和 MD5

    我有一个使用 TripleDes 和 MD5 的 Java 代码算法 这是我的java代码 private String encrypt String message String secretKey throws Exception Me
  • “找不到类型的属性”组合存储库 spring-data-neo4j

    我在用着spring data neo4j我正在尝试组合存储库以便能够使用自定义存储库 我认为我已经正确遵循了中指定的命名约定20 8 7 创建存储库 http docs spring io spring data neo4j docs 3
  • “双精度数组”和 TDoubleDynArray 之间的区别

    The System Typesunit 声明一个数组类型 TDoubleDynArray array of Double 如果我将一个方法声明为 procedure func x TDoubleDynArray 我注意到这个论点x行为就像
  • 使用 php ajax mysql 创建 3 个依赖下拉列表

    我正在使用 PHP MYSQL 和 JAVASCRIPT AJAX 我有多个下拉列表 我想使用 AJAX 使其相互依赖 其中这些下拉列表包含从 MYSQL 数据库检索的数据 用户从first下拉列表并根据其选择second and thir
  • 如何从矩阵中提取行名?

    我有一个行名称为日期的矩阵 我想将这些行名称提取到一个变量中 然后使用rownames 将这些日期应用到我拥有的另一个矩阵中 假设该矩阵称为 data matrix 每当我跑步时 data matrix 0 我得到了所有日期的打印输出 所以
  • Nodejs TCP连接客户端端口分配

    我使用nodejs在客户端和服务器之间创建了tcp连接 网络模块 https nodejs org api net html 服务器正在侦听已经预定义的端口 并且客户端正在连接到该端口 据我了解客户端的端口是由节点动态分配的 那是对的吗 节
  • 系统()的替代方案

    我最近开始接触C 编程 并且获得了很多经验 我过去的几个程序一直在使用 system 命令 我读过这应该是一个非常糟糕的主意 首先 为什么这是一个坏主意 我在 Linux 上使用它来执行诸如清除屏幕 例如 system clear 和启动程
  • 强制 Intellij IDEA 重新读取所有 Maven 依赖项

    如何强制intellij idea重新读取 更新pom文件中指定的所有依赖项 Press Ctrl Shift A to find actions and input reload you will find the Reload All
  • 如果事件处理程序不存在,则以编程方式在 VB.NET 中添加事件处理程序

    我正在尝试对 ASP NET 网页中的多个控件使用单个事件处理程序 当且仅当事件处理程序尚不存在时 我想在运行时添加事件处理程序 在 C 中 我将如下所示编写 if myTextBox OnTextChanged null myTextBo