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

ToolStripItemがオーバーフロー状態になったことを知る

注意:ここで紹介している方法は、.NET Framework 2.0以降でのみ使用できます。

デフォルトでは、ToolStripの幅が狭く、すべてのToolStripItemが表示しきれない時は、ToolStripの一番右にオーバーフローボタンが表示され、そのボタンを押すと表示しきれなくなったToolStripItemが表示されます(詳しくは、「ToolStrip(ツールバー、メニュー、ステータスバー)のオーバーフローを有効にする」をご覧ください)。

オーバーフロー

ToolStripItemがオーバーフロー状態になったことを知るためのイベントは存在しません。しかし、MSDNの「方法 : Windows フォームの ToolStrip オーバーフローを管理する」によると、ToolStripのLayoutCompletedイベントが発生した時に、ToolStripItem.Placementプロパティの値を調べて、ToolStripItemがオーバーフロー状態か調べることができるということです。

実際のコードは、例えば、次のようになりそうです。ここでは、toolStripButton1のオーバーフロー状態を監視しています。

VB.NET
コードを隠すコードを選択
Private toolStripButton1Placement As ToolStripItemPlacement = _
    ToolStripItemPlacement.None

'toolStrip1のLayoutCompletedイベントハンドラ
Private Sub toolStrip1_LayoutCompleted( _
        ByVal sender As Object, ByVal e As EventArgs) _
        Handles ToolStrip1.LayoutCompleted
    If ToolStripButton1.Placement <> toolStripButton1Placement Then
        If ToolStripButton1.Placement = ToolStripItemPlacement.Overflow Then
            Console.WriteLine( _
                "toolStripButton1がオーバーフロー状態になりました")
        Else If ToolStripButton1.Placement = ToolStripItemPlacement.Main Then
            Console.WriteLine( _
                "toolStripButton1がオーバーフロー状態ではなくなりました")
        End If
        toolStripButton1Placement = ToolStripButton1.Placement
    End If
End Sub
C#
コードを隠すコードを選択
private ToolStripItemPlacement toolStripButton1Placement =
    ToolStripItemPlacement.None;


//toolStrip1のLayoutCompletedイベントハンドラ
private void toolStrip1_LayoutCompleted(object sender, EventArgs e)
{
    if (toolStripButton1.Placement != toolStripButton1Placement)
    {
        if (toolStripButton1.Placement == ToolStripItemPlacement.Overflow)
        {
            Console.WriteLine(
                "toolStripButton1がオーバーフロー状態になりました");
        }
        else if (toolStripButton1.Placement == ToolStripItemPlacement.Main)
        {
            Console.WriteLine(
                "toolStripButton1がオーバーフロー状態ではなくなりました");
        }
        toolStripButton1Placement = toolStripButton1.Placement;
    }
}

実際に試してみると分かりますが、toolStripButton1がすでにオーバーフロー状態となっていても、toolStrip1の幅を変えた時に、「オーバーフロー状態になりました」と「オーバーフロー状態ではなくなりました」が連続して表示されることがあります。

補足:ToolStripのオーバーフローボタンの実体は、ToolStripOverflowButtonというToolStripItemであり、ToolStrip.OverflowButtonプロパティで取得することができます。よって、DropDownItemsプロパティで現在オーバーフロー状態となっているすべてのアイテムを取得できそうですが、実際にはできません。しかし、HasDropDownItemsプロパティは使えるようです。

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

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