C# 使用自定义事件参数覆盖事件

C# override event with custom eventargs

我需要一个自定义 NumericUpDown,其中事件 ValueChanged 应该传递 CancelEventArgs 而不是 EventArgs,因为我希望能够在验证某些条件时取消编辑(例如,我有两个 NumericUpDown,它们必须始终具有不同的值)。如果我尝试覆盖 OnValueChanged,我显然会收到错误消息。

protected override void OnValueChanged(CancelEventArgs e)
{
    if (e.Cancel)
        return;
    else
    {
        EventArgs args = (EventArgs)e;
        base.OnValueChanged(args);
    }
}

有办法吗?

我建议稍微更改取消行为的实现,而不是尝试通过事件参数传递取消信息,您可以通过向自定义组件引入新事件来按需查询它。这是一个简单的例子:

  class CustomNumericUpDown : NumericUpDown
  {
    protected override void OnValueChanged(EventArgs e)
    {
        if (QueryCancelValueChanging != null && QueryCancelValueChanging())
            return;
        else
        {
            EventArgs args = (EventArgs)e;
            base.OnValueChanged(args);
        }
    }

    public event Func<bool> QueryCancelValueChanging;
}

在这种情况下,您的组件的宿主可以订阅新事件以决定是否取消 "ValueChanged" 事件。

编辑: 使用示例:

 public partial class Form1 : Form
 {
    public Form1()
    {
        InitializeComponent();

        CustomNumericUpDown nudTest = new CustomNumericUpDown();
        nudTest.QueryCancelValueChanging += NudTest_QueryCancelValueChanging;
    }

    private bool NudTest_QueryCancelValueChanging()
    {
        return true;/* Replace by custom condition here*/
    }
}

如果您以前从未做过,也许您需要学习如何创建和管理自定义事件,应该很容易在网上找到关于此主题的教程 (like this one )