Jeroen,
However, even that is not how it's usually done, since there is seldom a
point to forcing derived classes to implement the event themselves. ....
If you really want to, you can define the add and remove accessors to call
virtual methods as well, so the child classes can override them, but this
is rarely useful.
I'm implementing winforms modeless picklist.
Picklist form contains picklist grid which raises EntitySelected event when
row is selected:
sealed class Grid<T> where T: EntityBase : BaseGrid {
internal event EntitySelectedEventHandler EntitySelected;
/// <summary>
/// Called when entity is selected by enter or by double click.
/// </summary>
/// <returns>true if event handler is present and event raised</returns>
bool OnEntitySelected() {
if (EntitySelected == null) return false;
T entityTmp = memoryCache.RetrieveElement(CurrentCell.RowIndex);
if (entityTmp == null)
// row has disappeared, some other user has changed data
return false;
EntitySelected(entityTmp);
return true;
}
Picklist form also implements EntitySelected event by forwarding it to
grid:
sealed class BrowseForm<T> where T: EntityBase : BrowseForm {
Grid<T> grid;
internal override event EntitySelectedEventHandler EntitySelect {
add {
grid.EntitySelected += value;
selectToolStripButton.Visible = true;
}
remove {
grid.EntitySelected -= value;
selectToolStripButton.Visible = false;
}
....
Combobox in main form invokes picklist form by using
class MyComboBox : ComboBox {
BrowseForm f;
protected override void OnDropDown(System.EventArgs e) {
f = new BrowseForm<Customer>();
f.EntitySelect += OnEntitySelected;
}
void OnEntitySelected(EntityBase selected) {
f.Close();
SelectedItem = selected;
Focus();
}
}
Questions:
1. Is this best design pattern for this ?
2. Picklist form sends selected event only to single form always, not to
multiple recipients for which event patter is designed. If main form is
closed before picklist form, event handler seems to be removed
automatically. So it is no need to implement remove. However event
implementation requires remove to be implemented.
Is it resonable to use delegate instead of event and implement only set
accessor ?
Andrus.