【问题标题】:How to clone value changed event from control at run time如何在运行时从控件中克隆值更改事件
【发布时间】:2019-12-26 11:03:45
【问题描述】:

我试图将事件从一个 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
  • 输入数字UpDown1
  • 数值改变了 numericUpDown1
  • 点击 numericUpDown1

对于 numericUpDown2:

  • 验证 numericUpDown1
  • 经过验证的 numericUpDown1
  • 输入数字UpDown2
  • 点击 numericUpDown2

没有值更改事件的情况相同。为了使它工作,我必须添加

numericUpDown2.ValueChanged += numericUpDown1_ValueChanged;

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

btw... numericUpDown 是唯一具有 ValueChanged - Event 的控件吗?

感谢您的帮助!

【问题讨论】:

  • 为什么要克隆事件?为什么不手动附加事件处理程序?它更干净,不需要任何破解。
  • ValueChangedNumericUpDown 的事件使用与常见事件不同的模式。它存储在onValueChanged 而不是EventHandlerList。要查看控件的常见事件模式,请查看 this document

标签: c# winforms events controls clone


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢!这就解释了为什么它不在列表中。不幸的是,事件处理程序只是私人的,所以我没有机会把它弄出来。所以我必须以其他方式做到这一点,但没关系。
  • 没问题。我建议不要复制事件。而是手动添加它们。
猜你喜欢
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
  • 2019-04-04
  • 1970-01-01
相关资源
最近更新 更多