c# - 如何在运行时从控件中克隆值更改事件
问题描述
我试图将事件从一个 NumericUpDown 克隆到另一个。我找到了一个几乎可以满足我所有需求的解决方案:
令人惊讶的是,ValueChanged - 事件不会被克隆,我不知道为什么。
这是我的代码
NumericUpDown numericUpDown2 = new NumericUpDown();
FieldInfo eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance);
var eventHandlerList = eventsField.GetValue(numericUpDown1);
eventsField.SetValue(numericUpDown2, eventHandlerList);
numericUpDown2.Location = new Point(100, 100);
numericUpDown2.Name = "numericUpDown2";
Controls.Add(numericUpDown2);
numericUpDown1 包含 ValueChanged、KeyDown、Validating、Validated、Enter、Leave 和 Click 的事件。例如:
private void numericUpDown1_Validating(object sender, CancelEventArgs e)
{
Debug.WriteLine("Validating " + ((Control)sender).Name);
}
我将一些调试信息写入输出窗口,该窗口显示 numericUpDown1 的以下内容:
- 验证 numericUpDown2
- 验证 numericUpDown2
- 输入数字UpDown1
- 值已更改 numericUpDown1
- 点击数字UpDown1
对于 numericUpDown2:
- 验证 numericUpDown1
- 验证 numericUpDown1
- 输入数字UpDown2
- 点击数字UpDown2
没有值更改事件也一样。为了使它工作,我必须添加
numericUpDown2.ValueChanged += numericUpDown1_ValueChanged;
但这不是我正在寻找的解决方案。我不明白为什么 ValueChanged - 事件是特殊的而不是复制到的。(我知道我只获得对事件的引用,当我从一个控件添加/删除一个事件时,另一个也会受到影响,但这正是我想要的)
顺便说一句... numericUpDown 是 ValueChanged - 事件的唯一控件吗?
感谢帮助!
解决方案
ValueChanged
event ofNumericUpDown
使用与常见事件不同的模式。它存储在onValueChanged
而不是EventHandlerList
:
private EventHandler onValueChanged = null;
public event EventHandler ValueChanged {
add {
onValueChanged += value;
}
remove {
onValueChanged -= value;
}
}
这基本上意味着,复制事件EventHandlerList
不会在这里为你做勾号。
要了解如何在控件中使用事件属性,请查看此文档:
推荐阅读
- sql-server - springboot中如何访问两个SQl服务器
- java - 根据 Java 环境变量中的值创建使用 @JsonIgnore 的自定义注释
- node.js - 在 async/await Express 路由器中使用 MongoDB 客户端的正确方法
- azure - 如何在 Azure 虚拟网络上限制出站连接到 URL 而不是 IP 地址?
- matlab - 矩阵的第一个非单维究竟是什么?
- python - Fast gradient sign method with keras
- javascript - 如何使用 webpack 排除“node_modules”中的 css 文件?
- awk - AWK 和多个空格(列分隔符)
- angularjs - AngularJS:401 - 未经授权:具有基本身份验证的 HttpInterceptor
- php - 基于运输方式和购物车总数的动态信息在 Woocommerce 中