DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

あるToolStripItem(ツールバーの項目)の右側に指定したToolStripItemが常にあるようにする

注意:ここで紹介している方法は、.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があるようしています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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を配置すれば、移動させることができるようになります。

  • 履歴:
  • 2014/9/15 タイトルを変更。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。