我正在努力将一些Visual Basic .NET代码移植到c#.NET,并且我移植的库中有一个特定的部分,我似乎无法开始工作。以下是它的布局:
首先,我有一个如下定义的接口:
public interface IMyInterface
{
void EnableSave(object sender, EventArgs e);
}
接下来,我有一个可继承的表单来实现上面的接口:
public partial class frmIMyInterface : Form, Globals.IMyInterface
{
public delegate void EnableFormSaveEventHandler(object sender, EventArgs e);
public event EnableFormSaveEventHandler EnableFormSave;
public void EnableSave(object sender, EventArgs e)
{
EnableFormSave.Invoke(sender, e);
}
}
到目前为止一切顺利。然后,我创建了一个实现frmIMyInterface的表单:
public partial class frmMyNewForm : frmIMyInterface
{
...
在那种形式中,我有一个定义来处理事件的方法:
private void EnableSave(object sender, EventArgs e)
{
this.cmdSave.Enabled = true;
}
然后,在表单的设计器代码中,处理程序委托定义如下:
this.EnableFormSave += new frmIMyInterface.EnableFormSaveEventHandler(this.EnableSave);
我的项目正常构建,但是,当我尝试使用表单设计器打开frmMyNewForm
时,我会看到一个闪屏,“为了防止在加载设计器之前可能丢失数据,必须解决以下错误:方法'EnableSave'不能是事件的方法,因为这个类派生的类已经定义了方法。“
我移植的VisualBasic.NET代码完全按照我的定义定义了所有内容,但工作正常。我看不出任何问题,似乎.NET应该知道引发事件的基类中的方法定义与被设置为事件处理程序的派生形式中定义的处理程序之间的区别。
提前谢谢!
答案 0 :(得分:0)
您必须重命名事件处理程序或事件。否则呼叫是不明确的。
这样可行:
this.EnableFormSave += new frmIBGInterface.EnableFormSaveEventHandler(this.OnEnableSave);
private void OnEnableSave(object sender, EventArgs e)
{
this.cmdSave.Enabled = true;
}
答案 1 :(得分:0)
c#中的常用模式是命名调用事件OnEnableSave的方法,并使其成为虚拟,以便派生类可以覆盖行为而无需附加到自己的事件。所以在frmIMyInterface中:
public virtual void OnEnableSave(EventArgs e)
{
//EnableFormSave.Invoke(sender, e);
// This is the usual way to invoke an event in c#
var handler = EnableFormSave;
if (handler != null) handler(this, e);
}
然后在frmMyNewForm
public override void OnEnableSave(EventArgs e)
{
base.OnEnableSave(e);
this.cmdSave.Enabled = true;
}
也就是说,制作调用事件公开的方法非常奇怪。我可能会将接口方法命名为EnableSave(),然后从该方法调用OnEnableSave()并使OnEnableSave()受到保护。