如何在 运行 时间从控件克隆值更改事件
How to clone value changed event from control at run time
我试图将事件从一个 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);
}
我将一些调试信息写入输出 Window,其中显示了 numericUpDown1 的以下内容:
- 正在验证 numericUpDown2
- 已验证 numericUpDown2
- 输入数字UpDown1
- 值已更改 numericUpDown1
- 点击 numericUpDown1
对于 numericUpDown2:
- 正在验证 numericUpDown1
- 已验证 numericUpDown1
- 输入数字UpDown2
- 点击 numericUpDown2
没有值改变事件也是一样。为了让它工作,我必须添加
numericUpDown2.ValueChanged += numericUpDown1_ValueChanged;
但这不是我正在寻找的解决方案。我不明白为什么 ValueChanged - 事件是特殊的东西而不是复制到。 (我知道我只得到对事件的引用,当我 add/remove 来自一个控件的事件时,另一个控件也会受到影响,但这正是我想要的)
顺便说一句...numericUpDown 是唯一具有 ValueChanged - 事件的控件吗?
感谢帮助!
ValueChanged
NumericUpDown
事件使用与普通事件不同的模式。它存储在 onValueChanged
而不是 EventHandlerList
:
private EventHandler onValueChanged = null;
public event EventHandler ValueChanged {
add {
onValueChanged += value;
}
remove {
onValueChanged -= value;
}
}
这基本上意味着,复制事件 EventHandlerList
不会在这里为您打勾。
要了解如何在控件中使用事件属性,请查看此文档:
我试图将事件从一个 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);
}
我将一些调试信息写入输出 Window,其中显示了 numericUpDown1 的以下内容:
- 正在验证 numericUpDown2
- 已验证 numericUpDown2
- 输入数字UpDown1
- 值已更改 numericUpDown1
- 点击 numericUpDown1
对于 numericUpDown2:
- 正在验证 numericUpDown1
- 已验证 numericUpDown1
- 输入数字UpDown2
- 点击 numericUpDown2
没有值改变事件也是一样。为了让它工作,我必须添加
numericUpDown2.ValueChanged += numericUpDown1_ValueChanged;
但这不是我正在寻找的解决方案。我不明白为什么 ValueChanged - 事件是特殊的东西而不是复制到。 (我知道我只得到对事件的引用,当我 add/remove 来自一个控件的事件时,另一个控件也会受到影响,但这正是我想要的)
顺便说一句...numericUpDown 是唯一具有 ValueChanged - 事件的控件吗?
感谢帮助!
ValueChanged
NumericUpDown
事件使用与普通事件不同的模式。它存储在 onValueChanged
而不是 EventHandlerList
:
private EventHandler onValueChanged = null;
public event EventHandler ValueChanged {
add {
onValueChanged += value;
}
remove {
onValueChanged -= value;
}
}
这基本上意味着,复制事件 EventHandlerList
不会在这里为您打勾。
要了解如何在控件中使用事件属性,请查看此文档: