Как сделать пользовательское событие для всех SmartParts?

Существует C# Project (.NET CF), который использует библиотеку OpenNETCF.IOC.(UI).

Фактическая ситуация: в базовой форме обрабатывается событие OnKeyDown и может быть вызвано пользовательское событие (например, если нажата пользовательская кнопка ESC). Это событие может быть обработано в дочерних формах.

После рефакторинга: Базовая форма теперь является контейнерной формой. Все дочерние формы теперь являются SmartParts. Как мне теперь поднять пользовательское событие из формы контейнера в SmartParts?

// Base form
private void BaseForm_KeyDown(object sender, KeyEventArgs e)
{
   // Handle ESC button
   if (e.KeyCode == Keys.Escape || e.KeyValue == SomeOtherESCCode)
   {
       this.ButtonESCClicked(sender, new EventArgs());
   }
 }

 // Descendant form
 private void frmMyForm_ButtonESCClicked(object sender, EventArgs e)
 {
     this.AutoValidate = AutoValidate.Disable;
     ...
 }

1 ответ

Решение

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

public abstract ParentClass : Smartpart
{
    public event EventHandler MyEvent;

    protected void RaiseMyEvent(EventArgs e)
    {
        var handler = MyEvent;
        if(handler != null) handler(this, e);
    }
}

public ChildClass : ParentClass
{
   void Foo()
   {
       // rais an event defined in a parent
       RaiseMyEvent(EventArgs.Empty);
   }
}

Если вы пытаетесь пойти другим путем, когда родитель уведомляет детей, это выглядит примерно так:

public abstract ParentClass : Smartpart
{
    protected virtual void OnMyEvent(EventArgs e) { } 

   void Foo()
   {
       // something happened, notify any child that wishes to know
       OnMyEvent(EventArgs.Empty);

       // you could optionally raise an event here so others could subscribe, too
   }
}

public ChildClass : ParentClass
{
    protected override void OnMyEvent(EventArgs e)
    {
        // this will get called by the parent/base class 
    }
}
Другие вопросы по тегам