|
|
|
The General Winforms Interview Questions consists the most frequently
asked questions in Winforms. This list of 100+ questions guage your familiarity
with the Winforms platform. The q&a have been collected over a period
of time from various blogs, forums and other similar Winforms sites
|
51. Framework Tips Events
|
| 51.1 How do I intercept event subscription of a event in my base class?
|
| 51.2 How do I control the order in which events are fired to multiple subscribers?
|
| 51.3 How do I figure out if a particular client object has subscribed to one of my events?
|
51.1 How do I intercept event subscription of a event in my base class?
|
|
In C# you could intercept what gets subscribed as follows: // In a Control derived class, for example: // Use override if the base class property was marked as virtual public new event EventHandler Click { add { // Do not let derived classes subscribe to this event, they should instead override OnClick. if(value.Target != this) base.Click += value; } remove { base.Click -= value; } }
|
51.2 How do I control the order in which events are fired to multiple subscribers?
|
|
|
|
// Use a custom Delegate to hold your subscribers
private EventHandler myHandlers;
// Control Click event firing, for example.
public new event EventHandler Click
{
add
{
this.myHandlers += value;
}
remove
{
this.myHandlers -= value;
}
}
protected override void OnClick(EventArgs e)
{
// First let my derived classes receive the Click event.
foreach(Delegate d in this.myHandler.GetInvocationList())
{
if(d.Target ==
this)
{
d.DynamicInvoke(new object[]{this, e});
break;
}
}
// Then let other subscribers receive the Click event.
foreach(Delegate d in this.myHandler.GetInvocationList())
{
if(d.Target !=
this)
d.DynamicInvoke(new object[]{this, e});
}
}
|
51.3 How do I figure out if a particular client object has subscribed to one of my events?
|
|
In C#, you can do as follows:
|
// In a Control derived class, for example, first store the handlers in a custom list.
private EventHandler myHandlers;
public new event EventHandler Click
{
add
{
this.myHandlers += value;
}
remove
{
this.myHandlers -= value;
}
}
// This method will specify whether a particular delegate is subscribed.
public bool IsSubscribed(Delegate del)
{
System.Delegate[] delegates =
this.myHandlers.GetInvocationList();
foreach(Delegate d in delegates)
{
if(d == del)
return true;
}
return false;
}
// Fire the Click event by parsing through your delegate list.
protected override void OnClick(EventArgs e)
{
// First let my derived classes receive the Click event.
foreach(Delegate d in this.myHandlers.GetInvocationList())
{
d.DynamicInvoke(new object[]{this, e});
}
}
|
|