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

C# 如何在运行时从控件克隆值更改事件,c#,winforms,events,controls,clone,C#,Winforms,Events,Controls,Clone,我试图将事件从一个NumericUpDown克隆到另一个。我找到了一个几乎能满足我所有需要的解决方案: 令人惊讶的是,ValueChanged-Event不会被克隆,我也不知道为什么 这是我的密码 NumericUpDown numericUpDown2 = new NumericUpDown(); FieldInfo eventsField = typeof(Component).GetField("events", BindingFlags.NonPubl

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

令人惊讶的是,ValueChanged-Event不会被克隆,我也不知道为什么

这是我的密码

        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
  • 已验证的数值UpDown2
  • 输入numericUpDown1
  • 数值已更改numericUpDown1
  • 单击numericUpDown1
对于numericUpDown2:

  • 正在验证numericUpDown1
  • 已验证的numericUpDown1
  • 输入numericUpDown2
  • 单击numericUpDown2
没有值更改事件,情况也一样。为了让它发挥作用,我必须补充一点

numericUpDown2.ValueChanged += numericUpDown1_ValueChanged;
但这不是我正在寻找的解决方案。我不明白为什么ValueChanged-Event是一个特殊的事件,而不是复制到。(我知道我只获得对事件的引用,当我从一个控件添加/删除事件时,另一个控件也会受到影响,但这正是我想要的)

顺便说一句。。。numericUpDown是否是唯一具有ValueChanged-Event的控件

谢谢你的帮助

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

private EventHandler onValueChanged = null;
public event EventHandler ValueChanged {
    add {
        onValueChanged += value;
    }
    remove {
        onValueChanged -= value;
    }
}
这基本上意味着,复制event
EventHandlerList
不会在这里为您打勾

要了解如何在控件中使用事件属性,请参阅以下文档:


为什么要克隆事件?为什么不手动附加事件处理程序?它更干净,不需要任何破解。
ValueChanged
event of
NumericUpDown
使用了与常见事件不同的模式。它存储在
onValueChanged
中,而不是
EventHandlerList
中。要查看控件的常见事件模式,请查看。非常感谢!这就解释了为什么它不在列表中。不幸的是,事件处理程序只能是私有的,所以我没有机会把它弄出来。所以我必须用其他的方法,但没关系,没问题。我建议不要复制事件。相反,手动添加它们。