IDesignerEventService Interface
Provides event notifications when root designers are added and removed, when a selected compnent changes, and when the current root designer changes.
For a list of all members of this type, see IDesignerEventService Members.
[Visual Basic] Public Interface IDesignerEventService [C#] public interface IDesignerEventService [C++] public __gc __interface IDesignerEventService [JScript] public interface IDesignerEventService
Remarks
IDesignerEventService provides notification when a new root designer is created, changed, or disposed. A root designer provides design time support for the base component of a document in designer view. The SelectionChanged event provides notification when the current component selection has changed.
Example
[Visual Basic, C#, C++] This example demonstrates a designer that uses the IDesignerEventService to display event notifications on a control. To use this example, compile the code to a class library. Add a reference to the library to a new Windows Forms project, and add the control within the library to the toolbar. You can add a component to the toolbar by right-clicking the Toolbar, clicking the Customize Toolbox... command, clicking the .NET Framework Components tab, browsing to the class library, and pressing the OK button. Add an instance of the DesignerMonitor control to a form in design mode. Right-click the control and click the Start monitoring command to display notifications of events raised by the IDesignerEventService.
[Visual Basic] Imports System Imports System.Collections Imports System.ComponentModel Imports System.ComponentModel.Design Imports System.Drawing Imports System.Windows.Forms Imports System.Windows.Forms.Design Namespace DesignerEventServiceExample ' DesignerMonitor provides a display for designer event notifications. <Designer(GetType(DesignerMonitorDesigner))> _ Public Class DesignerMonitor Inherits System.Windows.Forms.UserControl ' List to contain strings that describe designer events. Public updates As ArrayList Public monitoring_events As Boolean = False Public Sub New() updates = New ArrayList() Me.BackColor = Color.Beige Me.Size = New Size(450, 300) End Sub ' Display the message for the current mode, and any event messages if monitoring events Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) e.Graphics.DrawString("IDesignerEventService DesignerMonitor control", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Red), 5, 4) Dim yoffset As Integer = 10 If Not monitoring_events Then yoffset += 10 e.Graphics.DrawString("Currently not monitoring designer events.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 10) e.Graphics.DrawString("Use the shortcut menu commands", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 30) e.Graphics.DrawString("provided by an associated DesignerMonitorDesigner", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 40) e.Graphics.DrawString("to start or stop monitoring.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.Black), 5, yoffset + 50) Else e.Graphics.DrawString("Currently monitoring designer events.", New Font(FontFamily.GenericMonospace, 10), New SolidBrush(Color.DarkBlue), 5, yoffset + 10) e.Graphics.DrawString("Designer created, changed and disposed events:", New Font(FontFamily.GenericMonospace, 9), New SolidBrush(Color.Brown), 5, yoffset + 35) Dim i As Integer For i = 0 To updates.Count - 1 e.Graphics.DrawString(CStr(updates(i)), New Font(FontFamily.GenericMonospace, 8), New SolidBrush(Color.Black), 5, yoffset + 55 + 10 * i) yoffset += 10 Next i End If End Sub End Class ' DesignerMonitorDesigner uses the IDesignerEventService to send event information ' to an associated DesignerMonitor control's updates collection. Public Class DesignerMonitorDesigner Inherits System.Windows.Forms.Design.ControlDesigner Private dm As DesignerMonitor = Nothing Private dvc As DesignerVerbCollection = Nothing Private eventcount As Integer = 0 Public Sub New() ' Initializes the designer's shortcut menu with a "Start monitoring" command. dvc = New DesignerVerbCollection(New DesignerVerb() {New DesignerVerb("Start monitoring", AddressOf Me.StartMonitoring)}) End Sub Public Overrides Sub Initialize(ByVal component As System.ComponentModel.IComponent) MyBase.Initialize(component) Dim o As Object o = component If Not o.GetType() Is GetType(DesignerMonitor) Then Throw New Exception("This designer requires a DesignerMonitor control.") End If dm = CType(component, DesignerMonitor) End Sub Public Overrides ReadOnly Property Verbs() As System.ComponentModel.Design.DesignerVerbCollection Get Return dvc End Get End Property Private Sub StopMonitoring(ByVal sender As Object, ByVal e As EventArgs) Dim des As IDesignerEventService = CType(Me.Control.Site.GetService(GetType(IDesignerEventService)), IDesignerEventService) If des Is Nothing Then Return End If ' Remove event handlers for event notification methods. RemoveHandler des.DesignerCreated, AddressOf Me.DesignerCreated RemoveHandler des.DesignerDisposed, AddressOf Me.DesignerDisposed RemoveHandler des.ActiveDesignerChanged, AddressOf Me.DesignerChanged RemoveHandler des.SelectionChanged, AddressOf Me.SelectionChanged dm.monitoring_events = False ' Rebuild menu with "Start monitoring" command. dvc = New DesignerVerbCollection(New DesignerVerb() {New DesignerVerb("Start monitoring", AddressOf Me.StartMonitoring)}) dm.Refresh() End Sub Private Sub StartMonitoring(ByVal sender As Object, ByVal e As EventArgs) Dim des As IDesignerEventService = CType(Me.Control.Site.GetService(GetType(IDesignerEventService)), IDesignerEventService) If des Is Nothing Then Return End If ' Add event handlers for event notification methods. AddHandler des.DesignerCreated, AddressOf Me.DesignerCreated AddHandler des.DesignerDisposed, AddressOf Me.DesignerDisposed AddHandler des.ActiveDesignerChanged, AddressOf Me.DesignerChanged AddHandler des.SelectionChanged, AddressOf Me.SelectionChanged dm.monitoring_events = True ' Rebuild menu with "Stop monitoring" command. dvc = New DesignerVerbCollection(New DesignerVerb() {New DesignerVerb("Stop monitoring", AddressOf Me.StopMonitoring)}) dm.Refresh() End Sub Private Sub DesignerCreated(ByVal sender As Object, ByVal e As DesignerEventArgs) UpdateStatus(("Designer for " + e.Designer.RootComponent.Site.Name + " was created.")) End Sub Private Sub DesignerDisposed(ByVal sender As Object, ByVal e As DesignerEventArgs) UpdateStatus(("Designer for " + e.Designer.RootComponent.Site.Name + " was disposed.")) End Sub Private Sub DesignerChanged(ByVal sender As Object, ByVal e As ActiveDesignerEventArgs) UpdateStatus(("Active designer moved from " + e.OldDesigner.RootComponent.Site.Name + " to " + e.NewDesigner.RootComponent.Site.Name + ".")) End Sub Private Sub SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) UpdateStatus("A component selection was changed.") End Sub ' Update message buffer on DesignerMonitor control. Private Sub UpdateStatus(ByVal newmsg As String) If dm.updates.Count > 10 Then dm.updates.RemoveAt(10) End If dm.updates.Insert(0, "Event #" + eventcount.ToString() + ": " + newmsg) eventcount += 1 dm.Refresh() End Sub End Class End Namespace [C#] [C++] #using <mscorlib.dll> #using <system.dll> #using <system.design.dll> #using <system.windows.forms.dll> #using <system.drawing.dll> using namespace System; using namespace System::ComponentModel; using namespace System::ComponentModel::Design; using namespace System::Collections; using namespace System::Drawing; using namespace System::Windows::Forms; using namespace System::Windows::Forms::Design; namespace DesignerEventServiceExample { public __gc class DesignerMonitorDesigner; // DesignerMonitor provides a display for designer event notifications. [Designer(__typeof(DesignerMonitorDesigner))] public __gc class DesignerMonitor : public UserControl { public: // List to contain strings that describe designer events. ArrayList* updates; bool monitoring_events; DesignerMonitor() { monitoring_events = false; updates = new ArrayList(); this->BackColor = Color::White; this->Size = System::Drawing::Size(450, 300); } protected: // Display the message for the current mode, and any event messages if event monitoring is active. void OnPaint(PaintEventArgs* e) { e->Graphics->DrawString(S"IDesignerEventService DesignerMonitor Control", new System::Drawing::Font(FontFamily::GenericMonospace, 10), new SolidBrush(Color::Blue), 5, 4); int yoffset = 10; if(!monitoring_events) { yoffset += 10; e->Graphics->DrawString(S"Currently not monitoring designer events.", new System::Drawing::Font(FontFamily::GenericMonospace, 10), new SolidBrush(Color::Black), 5.f, yoffset+10.f); e->Graphics->DrawString(S"Use the shortcut menu commands", new System::Drawing::Font(FontFamily::GenericMonospace, 10), new SolidBrush(Color::Black), 5.f, yoffset+30.f); e->Graphics->DrawString(S"provided by an associated DesignerMonitorDesigner", new System::Drawing::Font(FontFamily::GenericMonospace, 10), new SolidBrush(Color::Black), 5.f, yoffset+40.f); e->Graphics->DrawString(S"to start or stop monitoring.", new System::Drawing::Font(FontFamily::GenericMonospace, 10), new SolidBrush(Color::Black), 5.f, yoffset+50.f); } else { e->Graphics->DrawString(S"Currently monitoring designer events.", new System::Drawing::Font(FontFamily::GenericMonospace, 10), new SolidBrush(Color::DarkBlue), 5.f, yoffset+10.f); e->Graphics->DrawString(S"Designer created, changed and disposed events:", new System::Drawing::Font(FontFamily::GenericMonospace, 9), new SolidBrush(Color::Brown), 5.f, yoffset+35.f); for(int i=0; i<updates->Count; i++) { e->Graphics->DrawString( static_cast<String*>(updates->Item[i]), new System::Drawing::Font(FontFamily::GenericMonospace, 8), new SolidBrush(Color::Black), 5.f, yoffset+55.f+(10*i)); yoffset+=10; } } } }; // DesignerMonitorDesigner uses the IDesignerEventService to send event information // to an associated DesignerMonitor control's updates collection. public __gc class DesignerMonitorDesigner : public ControlDesigner { private: DesignerMonitor* dm; DesignerVerbCollection* dvc; int eventcount; void StopMonitoring(Object* /*sender*/, EventArgs* /*e*/) { IDesignerEventService* des = dynamic_cast<IDesignerEventService*>(this->Control->Site->GetService(__typeof(IDesignerEventService))); if(des != 0) { // Remove event handlers for event notification methods. des->DesignerCreated -= new DesignerEventHandler(this, &DesignerMonitorDesigner::DesignerCreated); des->DesignerDisposed -= new DesignerEventHandler(this, &DesignerMonitorDesigner::DesignerDisposed); des->ActiveDesignerChanged -= new ActiveDesignerEventHandler(this, &DesignerMonitorDesigner::DesignerChanged); des->SelectionChanged -= new EventHandler(this, &DesignerMonitorDesigner::SelectionChanged); dm->monitoring_events = false; // Rebuild menu with "Start monitoring" command. DesignerVerb* myArray[] = { new DesignerVerb(S"Start monitoring", new EventHandler(this, &DesignerMonitorDesigner::StartMonitoring)) }; dvc = new DesignerVerbCollection( myArray ); dm->Refresh(); } } void StartMonitoring(Object* /*sender*/, EventArgs* /*e*/) { IDesignerEventService* des = dynamic_cast<IDesignerEventService*>(this->Control->Site->GetService(__typeof(IDesignerEventService))); if(des != 0) { // Add event handlers for event notification methods. des->DesignerCreated += new DesignerEventHandler(this, &DesignerMonitorDesigner::DesignerCreated); des->DesignerDisposed += new DesignerEventHandler(this, &DesignerMonitorDesigner::DesignerDisposed); des->ActiveDesignerChanged += new ActiveDesignerEventHandler(this, &DesignerMonitorDesigner::DesignerChanged); des->SelectionChanged += new EventHandler(this, &DesignerMonitorDesigner::SelectionChanged); dm->monitoring_events = false; // Rebuild menu with "Stop monitoring" command. DesignerVerb* myArray[] = { new DesignerVerb(S"Stop monitoring", new EventHandler(this, &DesignerMonitorDesigner::StopMonitoring)) }; dvc = new DesignerVerbCollection( myArray ); dm->Refresh(); } } void DesignerCreated(Object* /*sender*/, DesignerEventArgs* e) { UpdateStatus(String::Concat(S"Designer for ", e->Designer->RootComponent->Site->Name, S" was created.")); } void DesignerDisposed(Object* /*sender*/, DesignerEventArgs* e) { UpdateStatus(String::Concat(S"Designer for ", e->Designer->RootComponent->Site->Name, S" was disposed.")); } void DesignerChanged(Object* /*sender*/, ActiveDesignerEventArgs* e) { UpdateStatus(String::Concat(S"Active designer moved from ", e->OldDesigner->RootComponent->Site->Name, S" to ", e->NewDesigner->RootComponent->Site->Name, S".")); } void SelectionChanged(Object* /*sender*/, EventArgs* /*e*/) { UpdateStatus(S"A component selection was changed."); } // Update message buffer on DesignerMonitor control. void UpdateStatus(String* newmsg) { if( dm->updates->Count > 10 ) dm->updates->RemoveAt(10); dm->updates->Insert(0, String::Concat(S"Event #", eventcount.ToString(), S": ", newmsg)); eventcount++; dm->Refresh(); } }; }
[JScript] No example is available for JScript. To view a Visual Basic, C#, or C++ example, click the Language Filter button
in the upper-left corner of the page.
Requirements
Namespace: System.ComponentModel.Design
Platforms: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family
Assembly: System (in System.dll)
See Also
IDesignerEventService Members | System.ComponentModel.Design Namespace | DesignerEventHandler