我试图将事件从一个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.ValueChanged += numericUpDown1_ValueChanged;
但这不是我要寻找的解决方案。我不明白为什么ValueChanged-Event是特殊的东西而不被复制到其中。 (我知道我只获得事件的引用,并且当我从一个控件添加/删除一个事件时,另一个也会受到影响,但这正是我想要的)
btw ...是numericUpDown唯一具有ValueChanged-事件的控件吗?
感谢帮助!
答案 0 :(得分:1)
NumericUpDown
的 ValueChanged
事件使用与常见事件不同的模式。它存储在onValueChanged
中,而不是EventHandlerList
中:
private EventHandler onValueChanged = null;
public event EventHandler ValueChanged {
add {
onValueChanged += value;
}
remove {
onValueChanged -= value;
}
}
这基本上意味着,复制事件EventHandlerList
不会在这里为您打勾。
要了解如何在控件中使用事件属性,请查看此文档: