2014-02-19 2 views
0

В настоящее время я работаю над переносом на некоторый код 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

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

ответ

0

Необходимо переименовать либо обработчик событий, либо ваше событие. В противном случае вызов неоднозначен.

Так это работает:

this.EnableFormSave += new frmIBGInterface.EnableFormSaveEventHandler(this.OnEnableSave); 

private void OnEnableSave(object sender, EventArgs e) 
{ 
    this.cmdSave.Enabled = true; 
} 
+0

Спасибо. Так...Я думаю, VisualBasic.NET просто не заботится и вычисляет это без ошибок? Также ... событие называется 'EnableFormSave' ... так оно и есть. – John

+0

Мой плохой, неверный код для редактирования. Это должно работать. –

+0

Не знаю, почему, я думаю, он тоже не должен работать. –

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().

+0

Не могли бы вы рассказать о том, как вы думаете, что это должно быть правильно реализовано? Я не против изменения того, как это делается ... помните, что это порт. Я бы предпочел сделать это правильно, чем сделать это плохо, потому что так оно и было в VB. :) Цель состоит в том, чтобы унаследовать событие и срабатывать при изменении данных, а также заставить производную форму реализовать метод, чтобы что-то делать, когда это событие срабатывает (например, активировать кнопку сохранения). – John

+0

Хорошо, как ваше приложение в настоящее время структурировано? Где код, который определяет изменение данных и вызывает IMyInterface.EnableSave()? – Dominic

+0

Извините, все еще изучая, как это работает здесь ... Идея заключается в том, что это библиотека, и есть класс, по которому вы передаете свою форму, и она вращается через все элементы управления в форме и добавляет обработчик событий к соответствующее событие «... Изменено», основанное на типе управления. ' частный frmIMyInterface frmFoo; if (_ctrl - TextBox) { _ctrl.TextChanged + = new EventHandler (frmFoo.EnableSave); } else if ... ' Так как при создании формы он должен добавлять событие к каждому элементу управления, а когда данные управления изменяются, событие должно срабатывать и разрешать кнопку сохранения. – John

Смежные вопросы