注意:ここで紹介している方法は、.NET Framework 2.0以降でのみ使用できます。
例えば、ToolStripコントロールにToolStripComboBoxが配置されており、その説明のために左側にToolStripLabelを配置した場合、常にToolStripLabelがToolStripComboBoxの左隣にないと意味不明になってしまいます。しかし「ToolStripItem(ツールバー、メニュー、ステータスバーの項目)の位置をユーザーが変えられるようにする」で説明したようにToolStripのAllowItemReorderプロパティをTrueにしてユーザーがToolStripItemの位置を自由に変更できる時は、バラバラになってしまう可能性があります。
これを防ぐために、あるToolStripItem(ツールバーの項目)の右側に指定したToolStripItemが常にあるようにする方法を考えてみました。いろいろな方法が考えられますが、ここではToolStripItemのLocationChangedイベントで処理することにします。
下に示す例では、ToolStripにToolStripLabel(toolStripLabel1)とToolStripComboBox(toolStripComboBox1)が配置されている時、toolStripLabel1の右隣に常にtoolStripComboBox1があるようしています。
'toolStripLabel1のLocationChangedイベントハンドラ Private Sub toolStripLabel1_LocationChanged( _ ByVal sender As Object, ByVal e As EventArgs) _ Handles ToolStripLabel1.LocationChanged Dim item As ToolStripItem = CType(sender, ToolStripItem) If item.Equals(ToolStripLabel1) Then '常に隣にあるべきToolStripItem Dim nextItem As ToolStripItem = ToolStripComboBox1 If Not (nextItem Is Nothing) And _ Not (nextItem.Owner Is Nothing) Then If nextItem.Owner.Items.IndexOf(nextItem) <> _ item.Owner.Items.IndexOf(item) + 1 Then '削除してから挿入する '削除しないと不具合が生じる可能性あり nextItem.Owner.Items.Remove(nextItem) Dim insertIndex As Integer = _ item.Owner.Items.IndexOf(item) + 1 item.Owner.Items.Insert(insertIndex, nextItem) End If End If End If End Sub
//toolStripLabel1のLocationChangedイベントハンドラ private void toolStripLabel1_LocationChanged( object sender, EventArgs e) { ToolStripItem item = (ToolStripItem)sender; if (item.Equals(toolStripLabel1)) { //常に隣にあるべきToolStripItem ToolStripItem nextItem = toolStripComboBox1; if (nextItem != null && nextItem.Owner != null) { if (nextItem.Owner.Items.IndexOf(nextItem) != item.Owner.Items.IndexOf(item) + 1) { //削除してから挿入する //削除しないと不具合が生じる可能性あり nextItem.Owner.Items.Remove(nextItem); int insertIndex = item.Owner.Items.IndexOf(item) + 1; item.Owner.Items.Insert(insertIndex, nextItem); } } } }
「ToolStripItem(ツールバー、メニュー、ステータスバーの項目)の位置をユーザーが変えられるようにする」で説明したように、ToolStripControlHostを継承したToolStripItemはユーザーが移動させることができませんが、上記の方法のようにその左側にToolStripLabelを配置すれば、移動させることができるようになります。
(この記事は、「.NETプログラミング研究」で紹介したものを基にしています。)