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 )
我需要一个自定义 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 )