Назначение методов событиям на пользовательских элементах управления, объявленных в интерфейсе - PullRequest
0 голосов
/ 06 июля 2011

В C # я создаю пользовательские элементы управления для использования в пользовательских приложениях.Я хочу, чтобы каждый элемент управления реализовывал событие, которое сработает, если внутри элементов управления возникнет исключение или ошибка (ошибка внутренней проверки).Я создал интерфейс, который объявляет событие.Я создаю пользовательские элементы управления, которые реализуют интерфейс.Вот моя проблема.

Когда я добавляю один из моих пользовательских элементов управления в форму, я хочу пройтись по элементам управления в форме, обнаружить все элементы управления, которые являются моими пользовательскими элементами управления, а затем назначить обработчик события для события.Я заявляю в интерфейсе.Я не могу найти способ приведения объекта к типу интерфейса.

Рассмотрим:

interface IMyInterface
{
    event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

public partial class TextControl : UserControl, IMyInterface {
...
  public event ControlExceptionOccured ControlExceptionOccuredEvent;
...
}

, и в своей форме я использую один из этих TextControls.У меня есть этот метод:

private void Form1_Load(object sender, EventArgs e)
{
  foreach (Control Control in Controls)
  {
    if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)
    {
       ((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;
    }
  }
}

Это соответствует, но не будет выполняться.Как я могу добавить ControlExceptionHandler в цепочку событий?

Спасибо всем, кто пытается помочь.

Ответы [ 3 ]

0 голосов
/ 06 июля 2011

Это более простой способ сделать это:

if (control is IMyInterface)
    ((IMyInterface)control).ControlExceptionOccuredEvent += ControlExceptionHandler;

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

0 голосов
/ 06 июля 2011

Код

((IMyInterface)Control).ControlExceptionOccuredEvent += ControlExceptionHandler;

создает

Невозможно привести объект типа '... Text.TextControl' к типу 'IMyInterface'.

Я не понимаю, почему нет.

В качестве примечания я заменил

if (Control.GetType().GetInterface(typeof(IMyInterface).FullName) != null)

на

if (Control is IMyInterface)

, и он не работает.Второй пример никогда не возвращает истину.Я также пытался

if ((Control as IMyInterface) != null)

, и он также никогда не возвращает true.

0 голосов
/ 06 июля 2011

Насколько я понимаю, вы не можете подписаться на событие, потому что если условие возвращает FALSE. Ты пытался написать что-то подобное? :

foreach(Control ctrl in this.Controls){
    if((ctrl as IMyInterface) != null) {
        //do stuff
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...