В настоящее время я работаю над переносом на некоторый код 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 должен знать разницу между определением метода в базовом классе, который вызывает событие, и обработчиком, определенным в производной форме, который устанавливается как обработчик события.
Спасибо заранее!
В вашем frmMyNewForm есть * два метода * EnableSave(). Тот, который он наследует от базового класса и другого частного. Вы также получили предупреждение об этом, рекомендуя использовать ключевое слово * new *, если вы это сделали. Вы не хотите этого делать, нет смысла. Вы также допустили ошибку в методе frmIMyInterface.EnableSave(), он сработает и сгорит, если никакой обработчик событий не зарегистрирует событие. Он также не следует шаблону создания события, он должен быть защищенным виртуальным методом с именем OnEnableSave(). Имейте в виду, что C# не похож на VB.NET. –