ToolStripコントロールに任意のコントロールを追加する方法は、「ToolStrip(ツールバー、メニュー、ステータスバー)に任意のコントロールを配置する」で紹介しています。
.NET FrameworkのSystem.Windows.Forms.ToolBarにコンボボックスなどのコントロールを追加し、表示する方法は、残念ながら全く用意されていないようです(Placeholderがありません)。ということは、何とかごまかす方法を考えるしかないでしょう。
ツールバーにコンボボックスを表示される方法として、「C# Coner - How to create a "ComboBox button" in a toolbar in .NET」という記事がありますが、これはコンボボックスの代わりにDropDownButtonを使うというものです。
これ以外に、Separatorをいくつも追加し、Placeholderの代わりにする方法、ToolBarButtonの幅をSendMessageで変更し、Placeholderの代わりにする方法(Newsgroups:microsoft.public.dotnet.framework.windowsforms.controls - Re: ComboBox in a ToolBar? Any experts?)、コンテナにツールバーとコンボボックスを追加し、そのコンテナを一番上に表示させる方法(Newsgroups:microsoft.public.dotnet.framework.windowsforms.controls - Subject:RE: Ideas on how to host Combo Boxes etc on toolbar?)、PanelにButtonコントロールを並べてツールバーの代わりにする方法などがあるようです。
また、System.Windows.Forms.ToolBarの使用はあきらめて、こちらで紹介しているようなツールバーを使用する方法も考えられます。
ここでは、Separatorをいくつも追加し、Placeholderの代わりにする方法を使ってサンプル(メソッド)を書いてみます。Separatorを追加し、そのままコントロールをのせてしまうと、Separatorの線が見えてしまうかもしれませんので、Panelで覆い隠し、このPanelにコントロールをのせることにします。このサンプルでは、ただPanelとコントロールを配置しているだけですので、コントロールの位置を変える必要がある状況になっても、何もしないことに注意してください。(ツールバーの折り返しも許可していません。)
''' <summary> ''' ツールバーにコントロールを追加する ''' </summary> ''' <param name="ctr">追加するコントロール</param> ''' <param name="tbar">ツールバー</param> Public Shared Sub AddControlInToolbar( _ ByVal ctr As Control, ByVal tbar As ToolBar) Dim sepLeft As Integer = 0 Dim sepTop As Integer = 0 Dim sepRight As Integer = 0 Dim sepBottom As Integer = 0 'ツールバーの折り返しを禁止する '折り返しを許可する時は、toolbarのResizeイベントで 'Panelの位置を変更する必要がある tbar.Wrappable = False Dim first As Boolean = True Do 'セパレータを追加する Dim sep As New ToolBarButton sep.Style = ToolBarButtonStyle.Separator tbar.Buttons.Add(sep) '左端の座標を記憶 If first Then sepLeft = sep.Rectangle.Left sepTop = sep.Rectangle.Top first = False End If '右下の座標を取得 sepRight = sep.Rectangle.Right sepBottom = sep.Rectangle.Bottom 'コントロールの幅より小さい時は、さらにセパレータを追加 Loop While sepRight - sepLeft + 1 < ctr.Width 'ツールバーにパネルを追加し、大きさを合わせる Dim pnl As New Panel tbar.Controls.Add(pnl) pnl.SetBounds(sepLeft, sepTop, _ sepRight - sepLeft + 1, sepBottom - sepTop + 1) pnl.BringToFront() 'パネルにコントロールを追加する pnl.Controls.Add(ctr) ctr.Dock = DockStyle.Fill End Sub
/// <summary> /// ツールバーにコントロールを追加する /// </summary> /// <param name="ctr">追加するコントロール</param> /// <param name="tbar">ツールバー</param> public static void AddControlInToolbar(Control ctr, ToolBar tbar) { int sepLeft = 0, sepTop = 0, sepRight = 0, sepBottom = 0; //ツールバーの折り返しを禁止する //折り返しを許可する時は、toolbarのResizeイベントで //Panelの位置を変更する必要がある tbar.Wrappable = false; bool first = true; do { //セパレータを追加する ToolBarButton sep = new ToolBarButton(); sep.Style = ToolBarButtonStyle.Separator; tbar.Buttons.Add(sep); //左端の座標を記憶 if (first) { sepLeft = sep.Rectangle.Left; sepTop = sep.Rectangle.Top; first = false; } //右下の座標を取得 sepRight = sep.Rectangle.Right; sepBottom = sep.Rectangle.Bottom; //コントロールの幅より小さい時は、さらにセパレータを追加 } while(sepRight - sepLeft + 1 < ctr.Width); //ツールバーにパネルを追加し、大きさを合わせる Panel pnl = new Panel(); tbar.Controls.Add(pnl); pnl.SetBounds(sepLeft, sepTop, sepRight - sepLeft + 1, sepBottom - sepTop + 1); pnl.BringToFront(); //パネルにコントロールを追加する pnl.Controls.Add(ctr); ctr.Dock = DockStyle.Fill; }
次に上記メソッドを使用する例を示します。フォームにツールバーToolBar1とコンボボックスComboBox1があるとして、ToolBar1にいくつかのボタンと、ComboBox1を追加しています。
'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load Dim tbb As ToolBarButton 'ツールバーにボタンを追加 tbb = New ToolBarButton tbb.ImageIndex = 1 ToolBar1.Buttons.Add(tbb) 'ツールバーにセパレータを追加 tbb = New ToolBarButton tbb.Style = ToolBarButtonStyle.Separator ToolBar1.Buttons.Add(tbb) 'ツールバーにComboBox1を追加 AddControlInToolbar(ComboBox1, ToolBar1) 'ツールバーにセパレータを追加 tbb = New ToolBarButton tbb.Style = ToolBarButtonStyle.Separator ToolBar1.Buttons.Add(tbb) 'ツールバーにボタンを追加 tbb = New ToolBarButton tbb.ImageIndex = 2 ToolBar1.Buttons.Add(tbb) End Sub
//フォームのLoadイベントハンドラ private void Form1_Load(object sender, System.EventArgs e) { ToolBarButton tbb; //ツールバーにボタンを追加 tbb = new ToolBarButton(); tbb.ImageIndex = 1; ToolBar1.Buttons.Add(tbb); //ツールバーにセパレータを追加 tbb = new ToolBarButton(); tbb.Style = ToolBarButtonStyle.Separator; ToolBar1.Buttons.Add(tbb); //ツールバーにComboBox1を追加 AddControlInToolbar(ComboBox1, ToolBar1); //ツールバーにセパレータを追加 tbb = new ToolBarButton(); tbb.Style = ToolBarButtonStyle.Separator; ToolBar1.Buttons.Add(tbb); //ツールバーにボタンを追加 tbb = new ToolBarButton(); tbb.ImageIndex = 2; ToolBar1.Buttons.Add(tbb); }