C#使用自定义eventargs覆盖事件

时间:2018-03-20 11:55:24

标签: c# events event-handling override 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);
    }
}

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

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

  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