http://someuser77.com/guides/adding-controls-to-toolstrip/
Adding controls to ToolStrip in C#
The
ToolStrip control is capable of holding some common controls that comes with the .NET framework such as the
ToolStripButton, the
ToolStripComboBox and several others.
What about adding a non standard control such as a
CheckBox or a
MonthCalendar? Using the
ToolStripControlHost one can do exactly this.
As it is stated in the MSDN article
How to: Wrap a Windows Forms Control with ToolStripControlHost you should derive from the ToolStripControlHost class:
public classToolStripCheckBox : ToolStripControlHost
{
public ToolStripCheckBox()
: base(newCheckBox())
{
}
}
now the CheckBox can be added to the ToolStrip using:
ToolStripCheckBox toolStripCheckBox = newToolStripCheckBox();
toolStrip1.Items.Add((ToolStripItem)toolStripCheckBox);
And the CheckBox properties and events can be accessed using:
(toolStripCheckBox.Control asCheckBox).Text = "CheckBox";
(toolStripCheckBox.Control asCheckBox).CheckedChanged += (sender, e) => MessageBox.Show((sender asCheckBox).Checked.ToString());
To remove the casting from the user code and since C# does not supportmultiple inharitance it is suggested to incapsulate all the commonmethods and properties of CheckBox:
publicCheckBox CheckBoxControl
{
get { return Control asCheckBox; }
}
publicbool Checked
{
get { return CheckBoxControl.Checked; }
set { CheckBoxControl.Checked = value; }
}
so now you can write:
toolStripCheckBox.CheckBoxControl.Text = "CheckBox";
toolStripCheckBox.CheckBoxControl.CheckedChanged += (sender, e) => MessageBox.Show((sender asCheckBox).Checked.ToString());
finally provide the events you wish to access directly from the ToolStripControlHost:
public eventEventHandler CheckedChanged;
public void OnCheckedChanged(object sender, EventArgs e)
{
if (CheckedChanged != null)
{
CheckedChanged(this, e);
}
}
protectedoverridevoid OnSubscribeControlEvents(Control control)
{
base.OnSubscribeControlEvents(control);
(control asCheckBox).CheckedChanged += OnCheckedChanged;
}
protectedoverridevoid OnUnsubscribeControlEvents(Control control)
{
base.OnUnsubscribeControlEvents(control);
(control asCheckBox).CheckedChanged -= OnCheckedChanged;
}
or if you want that the CheckedChanged event will hold the CheckBox as the sender instead of the ToolStripCheckBox replace:
public void OnCheckedChanged(object sender, EventArgs e)
{
if (CheckedChanged != null)
{
CheckedChanged(this, e);
}
}
with:
public void OnCheckedChanged(object sender, EventArgs e)
{
if (CheckedChanged != null)
{
CheckedChanged(sender, e);
}
}
so now you can write:
toolStripCheckBox.CheckedChanged += (sender, e) => MessageBox.Show((sender asToolStripCheckBox).Checked.ToString());
finally if you wish to add the control to the toolstrip in the designer add the
ToolStripItemDesignerAvailability Attribute to the ToolStripCheckBox class:
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability.ToolStrip)]
public classToolStripCheckBox : ToolStripControlHost
{
...
now you can select the CheckBox from the designer by right clicking the toolstrip and selecting 'Edit Items...'
and even view the exposed event in the control properties:
The c