C# 如何在运行时从控件克隆值更改事件
我试图将事件从一个NumericUpDown克隆到另一个。我找到了一个几乎能满足我所有需要的解决方案: 令人惊讶的是,ValueChanged-Event不会被克隆,我也不知道为什么 这是我的密码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 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
- 正在验证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;
}
}
这基本上意味着,复制eventEventHandlerList
不会在这里为您打勾
要了解如何在控件中使用事件属性,请参阅以下文档:
ValueChanged
event ofNumericUpDown
使用了与常见事件不同的模式。它存储在onValueChanged
中,而不是EventHandlerList
中。要查看控件的常见事件模式,请查看。非常感谢!这就解释了为什么它不在列表中。不幸的是,事件处理程序只能是私有的,所以我没有机会把它弄出来。所以我必须用其他的方法,但没关系,没问题。我建议不要复制事件。相反,手动添加它们。