如何在运行时从控件克隆值更改事件



我试图将事件从一个 NumericUpDown 克隆到另一个 on。我找到了一个几乎满足我所有需求的解决方案:

如何在运行时克隆控件事件处理程序?

令人惊讶的是,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);
}

我将一些调试信息写入输出窗口,其中显示了数字UpDown1的以下内容:

  • 验证数字向上向下2
  • 已验证的数值向下2
  • 输入数字上下1
  • 值已更改 数字向上向下1
  • 单击数字向上向下1

对于 numericUpDown2:

  • 验证数字向上向下1
  • 已验证数字向上向下1
  • 输入数字上下2
  • 单击数字向上向下2

没有值更改事件也是如此。要使其工作,我必须添加

numericUpDown2.ValueChanged += numericUpDown1_ValueChanged;

但这不是我正在寻找的解决方案。我不明白为什么 ValueChanged - 事件是特别的并且没有复制到。(我知道我只得到对事件的引用,当我从一个控件添加/删除事件时,另一个控件也会受到影响,但这正是我想要的(

顺便说一下...数字上下是唯一具有值更改 - 事件的控件吗?

感谢您的帮助!

ValueChangedNumericUpDown事件使用与常见事件不同的模式。它存储在onValueChanged而不是EventHandlerList

private EventHandler onValueChanged = null;
public event EventHandler ValueChanged {
add {
onValueChanged += value;
}
remove {
onValueChanged -= value;
}
}

这基本上意味着,复制事件EventHandlerList不会在这里为您打勾。

若要了解如何在控件中使用事件属性,请查看此文档:

  • 如何:使用事件属性处理多个事件

最新更新