Как сделать пользовательское событие для всех 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
}
}