【发布时间】:2019-12-26 11:03:45
【问题描述】:
我试图将事件从一个 NumericUpDown 克隆到另一个。我找到了一个几乎可以满足我所有需求的解决方案:
How to clone Control event handlers at run time?
令人惊讶的是,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
- 点击 numericUpDown1
对于 numericUpDown2:
- 验证 numericUpDown1
- 经过验证的 numericUpDown1
- 输入数字UpDown2
- 点击 numericUpDown2
没有值更改事件的情况相同。为了使它工作,我必须添加
numericUpDown2.ValueChanged += numericUpDown1_ValueChanged;
但这不是我正在寻找的解决方案。我不明白为什么 ValueChanged - 事件是特殊的而不是复制到的。 (我知道我只获得对事件的引用,当我从一个控件添加/删除一个事件时,另一个也会受到影响,但这正是我想要的)
btw... numericUpDown 是唯一具有 ValueChanged - Event 的控件吗?
感谢您的帮助!
【问题讨论】:
-
为什么要克隆事件?为什么不手动附加事件处理程序?它更干净,不需要任何破解。
-
ValueChangedNumericUpDown的事件使用与常见事件不同的模式。它存储在onValueChanged而不是EventHandlerList。要查看控件的常见事件模式,请查看 this document。
标签: c# winforms events controls clone