How to: Wrap a Windows Forms Control with ToolStripControlHost

ToolStripControlHost is designed to enable hosting of arbitrary Windows Forms controls by using the ToolStripControlHost constructor or by extending ToolStripControlHost itself. It is easier to wrap the control by extending ToolStripControlHost and implementing properties and methods that expose frequently used properties and methods of the control. You can also expose events for the control at the ToolStripControlHost level.

To host a control in a ToolStripControlHost by derivation

  1. Extend ToolStripControlHost. Implement a default constructor that calls the base class constructor passing in the desired control.

    ' Call the base constructor passing in a MonthCalendar instance. 
    Public Sub New() 
        MyBase.New(New MonthCalendar())
    
    End Sub
    
    // Call the base constructor passing in a MonthCalendar instance. 
            public ToolStripMonthCalendar() : base (new MonthCalendar()) { }
    
    // Call the base constructor passing in a MonthCalendar instance.
    ToolStripMonthCalendar() : ToolStripControlHost( gcnew MonthCalendar ) {}
    
  2. Declare a property of the same type as the wrapped control and return Control as the correct type of control in the property's accessor.

    Public ReadOnly Property MonthCalendarControl() As MonthCalendar 
        Get 
            Return CType(Control, MonthCalendar)
        End Get 
    End Property
    
    public MonthCalendar MonthCalendarControl
            {
                get
                {
                    return Control as MonthCalendar;
                }
            }
    
    property MonthCalendar^ MonthCalendarControl 
    {
       MonthCalendar^ get()
       {
          return static_cast<MonthCalendar^>(Control);
       }
    }
    
  3. Expose other frequently used properties and methods of the wrapped control with properties and methods in the extended class.

    ' Expose the MonthCalendar.FirstDayOfWeek as a property. 
    Public Property FirstDayOfWeek() As Day 
        Get 
            Return MonthCalendarControl.FirstDayOfWeek
        End Get 
        Set
            value = MonthCalendarControl.FirstDayOfWeek
        End Set 
    End Property 
    
    ' Expose the AddBoldedDate method. 
    Public Sub AddBoldedDate(ByVal dateToBold As DateTime) 
        MonthCalendarControl.AddBoldedDate(dateToBold)
    
    End Sub
    
    // Expose the MonthCalendar.FirstDayOfWeek as a property. 
            public Day FirstDayOfWeek
            {
                get
                {
                    return MonthCalendarControl.FirstDayOfWeek;
                }
                set { value = MonthCalendarControl.FirstDayOfWeek; }
            }
    
            // Expose the AddBoldedDate method. 
            public void AddBoldedDate(DateTime dateToBold)
            {
                MonthCalendarControl.AddBoldedDate(dateToBold);
            }
    
    property Day FirstDayOfWeek 
    {
       // Expose the MonthCalendar.FirstDayOfWeek as a property.
       Day get()
       {
          return MonthCalendarControl->FirstDayOfWeek;
       }
    
       void set( Day value )
       {
          value = MonthCalendarControl->FirstDayOfWeek;
       }
    }
    
    // Expose the AddBoldedDate method. 
    void AddBoldedDate( DateTime dateToBold )
    {
       MonthCalendarControl->AddBoldedDate( dateToBold );
    }
    
  4. Optionally, override the OnSubscribeControlEvents, and OnUnsubscribeControlEvents methods and add the control events you want to expose.

    Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control) 
    
        ' Call the base so the base events are connected. 
        MyBase.OnSubscribeControlEvents(c)
    
        ' Cast the control to a MonthCalendar control. 
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)
    
        ' Add the event. 
        AddHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged
    
    End Sub 
    
    Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control)
        ' Call the base method so the basic events are unsubscribed. 
        MyBase.OnUnsubscribeControlEvents(c)
    
        ' Cast the control to a MonthCalendar control. 
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)
    
        ' Remove the event. 
        RemoveHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged
    
    End Sub
    
    protected override void OnSubscribeControlEvents(Control c)
            {
                // Call the base so the base events are connected. 
                base.OnSubscribeControlEvents(c);
    
                // Cast the control to a MonthCalendar control.
                MonthCalendar monthCalendarControl = (MonthCalendar) c;
    
                // Add the event.
                monthCalendarControl.DateChanged +=
                    new DateRangeEventHandler(OnDateChanged);
            }
    
            protected override void OnUnsubscribeControlEvents(Control c)
            {
                // Call the base method so the basic events are unsubscribed. 
                base.OnUnsubscribeControlEvents(c);
    
                // Cast the control to a MonthCalendar control.
                MonthCalendar monthCalendarControl = (MonthCalendar) c;
    
                // Remove the event.
                monthCalendarControl.DateChanged -=
                    new DateRangeEventHandler(OnDateChanged);
            }
    
    void OnSubscribeControlEvents( System::Windows::Forms::Control^ c )
    {
       // Call the base so the base events are connected.
       __super::OnSubscribeControlEvents( c );
    
       // Cast the control to a MonthCalendar control.
       MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;
    
       // Add the event.
       monthCalendarControl->DateChanged += gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
    }
    
    void OnUnsubscribeControlEvents( System::Windows::Forms::Control^ c )
    {
    
       // Call the base method so the basic events are unsubscribed.
       __super::OnUnsubscribeControlEvents( c );
    
       // Cast the control to a MonthCalendar control.
       MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;
    
       // Remove the event.
       monthCalendarControl->DateChanged -= gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
    }
    
  5. Provide the necessary wrapping for the events you want to expose.

        ' Declare the DateChanged event. 
        Public Event DateChanged As DateRangeEventHandler
    
        ' Raise the DateChanged event. 
        Private Sub HandleDateChanged(ByVal sender As Object, _
            ByVal e As DateRangeEventArgs)
    
            RaiseEvent DateChanged(Me, e)
        End Sub 
    End Class
    
    // Declare the DateChanged event. 
            public event DateRangeEventHandler DateChanged;
    
            // Raise the DateChanged event. 
            private void OnDateChanged(object sender, DateRangeEventArgs e)
            {
                if (DateChanged != null)
                {
                    DateChanged(this, e);
                }
            }
    
    // Declare the DateChanged event. 
    // Raise the DateChanged event. 
    void HandleDateChanged( Object^ sender, DateRangeEventArgs^ e )
    {
       if ( DateChanged != nullptr )
       {
          DateChanged( this, e );
       }
    }
    

Example

'Declare a class that inherits from ToolStripControlHost. 

Public Class ToolStripMonthCalendar
    Inherits ToolStripControlHost

    ' Call the base constructor passing in a MonthCalendar instance. 
    Public Sub New() 
        MyBase.New(New MonthCalendar())

    End Sub 

    Public ReadOnly Property MonthCalendarControl() As MonthCalendar 
        Get 
            Return CType(Control, MonthCalendar)
        End Get 
    End Property 

    ' Expose the MonthCalendar.FirstDayOfWeek as a property. 
    Public Property FirstDayOfWeek() As Day 
        Get 
            Return MonthCalendarControl.FirstDayOfWeek
        End Get 
        Set
            value = MonthCalendarControl.FirstDayOfWeek
        End Set 
    End Property 

    ' Expose the AddBoldedDate method. 
    Public Sub AddBoldedDate(ByVal dateToBold As DateTime) 
        MonthCalendarControl.AddBoldedDate(dateToBold)

    End Sub 

    ' Subscribe and unsubscribe the control events you wish to expose. 
    Protected Overrides Sub OnSubscribeControlEvents(ByVal c As Control) 

        ' Call the base so the base events are connected. 
        MyBase.OnSubscribeControlEvents(c)

        ' Cast the control to a MonthCalendar control. 
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)

        ' Add the event. 
        AddHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged

    End Sub 

    Protected Overrides Sub OnUnsubscribeControlEvents(ByVal c As Control)
        ' Call the base method so the basic events are unsubscribed. 
        MyBase.OnUnsubscribeControlEvents(c)

        ' Cast the control to a MonthCalendar control. 
        Dim monthCalendarControl As MonthCalendar = _
            CType(c, MonthCalendar)

        ' Remove the event. 
        RemoveHandler monthCalendarControl.DateChanged, _
            AddressOf HandleDateChanged

    End Sub 

    ' Declare the DateChanged event. 
    Public Event DateChanged As DateRangeEventHandler

    ' Raise the DateChanged event. 
    Private Sub HandleDateChanged(ByVal sender As Object, _
        ByVal e As DateRangeEventArgs)

        RaiseEvent DateChanged(Me, e)
    End Sub 
End Class
//Declare a class that inherits from ToolStripControlHost. 
    public class ToolStripMonthCalendar : ToolStripControlHost
    {
        // Call the base constructor passing in a MonthCalendar instance. 
        public ToolStripMonthCalendar() : base (new MonthCalendar()) { }

        public MonthCalendar MonthCalendarControl
        {
            get
            {
                return Control as MonthCalendar;
            }
        }

        // Expose the MonthCalendar.FirstDayOfWeek as a property. 
        public Day FirstDayOfWeek
        {
            get
            {
                return MonthCalendarControl.FirstDayOfWeek;
            }
            set { value = MonthCalendarControl.FirstDayOfWeek; }
        }

        // Expose the AddBoldedDate method. 
        public void AddBoldedDate(DateTime dateToBold)
        {
            MonthCalendarControl.AddBoldedDate(dateToBold);
        }

        // Subscribe and unsubscribe the control events you wish to expose. 
        protected override void OnSubscribeControlEvents(Control c)
        {
            // Call the base so the base events are connected. 
            base.OnSubscribeControlEvents(c);

            // Cast the control to a MonthCalendar control.
            MonthCalendar monthCalendarControl = (MonthCalendar) c;

            // Add the event.
            monthCalendarControl.DateChanged +=
                new DateRangeEventHandler(OnDateChanged);
        }

        protected override void OnUnsubscribeControlEvents(Control c)
        {
            // Call the base method so the basic events are unsubscribed. 
            base.OnUnsubscribeControlEvents(c);

            // Cast the control to a MonthCalendar control.
            MonthCalendar monthCalendarControl = (MonthCalendar) c;

            // Remove the event.
            monthCalendarControl.DateChanged -=
                new DateRangeEventHandler(OnDateChanged);
        }

        // Declare the DateChanged event. 
        public event DateRangeEventHandler DateChanged;

        // Raise the DateChanged event. 
        private void OnDateChanged(object sender, DateRangeEventArgs e)
        {
            if (DateChanged != null)
            {
                DateChanged(this, e);
            }
        }
    }
//Declare a class that inherits from ToolStripControlHost. 
public ref class ToolStripMonthCalendar: public ToolStripControlHost
{
public:
   // Call the base constructor passing in a MonthCalendar instance.
   ToolStripMonthCalendar() : ToolStripControlHost( gcnew MonthCalendar ) {}

   property MonthCalendar^ MonthCalendarControl 
   {
      MonthCalendar^ get()
      {
         return static_cast<MonthCalendar^>(Control);
      }
   }
   property Day FirstDayOfWeek 
   {
      // Expose the MonthCalendar.FirstDayOfWeek as a property.
      Day get()
      {
         return MonthCalendarControl->FirstDayOfWeek;
      }

      void set( Day value )
      {
         value = MonthCalendarControl->FirstDayOfWeek;
      }
   }

   // Expose the AddBoldedDate method. 
   void AddBoldedDate( DateTime dateToBold )
   {
      MonthCalendarControl->AddBoldedDate( dateToBold );
   }

protected:
   // Subscribe and unsubscribe the control events you wish to expose. 
   void OnSubscribeControlEvents( System::Windows::Forms::Control^ c )
   {
      // Call the base so the base events are connected.
      __super::OnSubscribeControlEvents( c );

      // Cast the control to a MonthCalendar control.
      MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;

      // Add the event.
      monthCalendarControl->DateChanged += gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
   }

   void OnUnsubscribeControlEvents( System::Windows::Forms::Control^ c )
   {

      // Call the base method so the basic events are unsubscribed.
      __super::OnUnsubscribeControlEvents( c );

      // Cast the control to a MonthCalendar control.
      MonthCalendar^ monthCalendarControl = (MonthCalendar^)c;

      // Remove the event.
      monthCalendarControl->DateChanged -= gcnew DateRangeEventHandler( this, &ToolStripMonthCalendar::HandleDateChanged );
   }

public:
   event DateRangeEventHandler^ DateChanged;

private:
   // Declare the DateChanged event. 
   // Raise the DateChanged event. 
   void HandleDateChanged( Object^ sender, DateRangeEventArgs^ e )
   {
      if ( DateChanged != nullptr )
      {
         DateChanged( this, e );
      }
   }
};

Compiling the Code

  • This example requires:

  • References to the System and System.Windows.Forms assemblies.

For information about building this example from the command line for Visual Basic or Visual C#, see Building from the Command Line (Visual Basic) or Command-line Building With csc.exe. You can also build this example in Visual Studio by pasting the code into a new project. How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio
How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio
How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio
How to: Compile and Run a Complete Windows Forms Code Example Using Visual Studio

See Also

Concepts

ToolStrip Control Architecture

ToolStrip Technology Summary

Reference

ToolStripControlHost

ToolStrip Control Overview (Windows Forms)