我的意图是重用从SelectedValueChanged
类继承的ComboBox
事件(反过来,继承自ListControl
类)
在下面的代码中:SelectedValueChanged
被标记为屏幕截图中显示的编译器错误。我不打算hiding
继承事件,因此我不想使用new
关键字。我希望从DRT_ComboBox_Abstract派生的类能够按原样使用继承的事件。
如何使用从基类继承的事件定义EventHandler
? (或者,在理解事件方面,我完全离开这个星球吗?)
注意:"显示可能的修复"使用public event EventHandler SelectedValueChanged
围绕#pragma warning disable CS0108
只会禁用警告。
using System;
using System.Windows.Forms;
namespace DRT
{
internal abstract partial class DRT_ComboBox_Abstract : ComboBox
{
//SelectedValueChanged is tagged with the compiler error shown in the screenshot
public event EventHandler SelectedValueChanged;
public DRT_ComboBox_Abstract()
{
InitializeComponent();
}
public void Disable()
{
this.Enabled = false;
}
public void _OnSelectedValueChanged(object sender, System.EventArgs e)
{
this.SelectedValueChanged?.Invoke(sender, e);
}
}
}
答案 0 :(得分:5)
您不需要再次申报该活动。如果它是公共的并且在需要时它已被抛出,则可以通过订阅基类事件来处理所需的更改。
我的意思是,你可以这样做:
using System;
using System.Windows.Forms;
namespace DRT
{
internal abstract partial class DRT_ComboBox_Abstract : ComboBox
{
public DRT_ComboBox_Abstract()
{
InitializeComponent();
SelectedValueChanged += MyOwnHandler
}
protected virtual void MyOwnHandler(object sender, EventArgs args)
{
// Hmn.. now I know that the selection has changed and can so somethig from here
// This method is acting like a simple client
}
}
}
在SOLID类上(我相信ComboBox
就是这种情况),通常有效调用订阅者来处理某些事件的方法通常是虚拟的,一旦你做了,你就可以了继承自这个类,拦截事件处理程序调用,如果它是你想要的。
是:
using System;
using System.Windows.Forms;
namespace DRT
{
internal abstract partial class DRT_ComboBox_Abstract : ComboBox
{
public DRT_ComboBox_Abstract()
{
InitializeComponent();
}
protected override void OnSelectedValueChanged(object sender, EventArgs args)
{
// Wait, the base class is attempting to notify the subscribers that Selected Value has Changed! Let me do something before that
// This method is intercepting the event notification
// Do stuff
// Continue throwing the notification
base.OnSelectedValueChanged(sender, args);
}
}
}
注意:我已经删除了Disable
方法,只是为了简化代码。它超出了本主题范围
我希望它有所帮助。