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

メニュー項目が表示される直前にメニュー項目のテキストや状態の変更を行う

メニューに表示する項目のテキストをその時の状況によって変更したいというケースがあります。同じように、その時の状況によって、メニュー項目の無効化、チェックのオンオフ、項目の追加や削除など、メニュー項目の状態を変更したいというケースもあります。このような時は、メニュー項目が表示される直前にメニュー項目の状態を変更するとよいでしょう。ここでは、その方法を説明します。

.NET Framework 2.0以降で、MenuStripコントロールを使用している場合

.NET Framework 2.0から追加されたMenuStripコントロールの場合は、メニュー項目が表示される直前(ドロップダウンメニューが表示される直前)に、その親であるメニュー項目でToolStripMenuItem.DropDownOpeningイベントが発生します。

なおドロップダウンメニューが表示された直後にはDropDownOpenedイベントが、ドロップダウンメニューが閉じた直後にはDropDownClosedイベントが発生します。

現在の日時によってメニュー項目の状態を変更する例を以下に示します。この例では、MenuStripコントロールに親となる項目「parentToolStripMenuItem」がすでにあり、その子項目として「toolStripMenuItem1」と「toolStripMenuItem2」があるものとします。

VB.NET
コードを隠すコードを選択
'parentToolStripMenuItemのDropDownOpeningイベントハンドラ
Private Sub parentToolStripMenuItem_DropDownOpening( _
    sender As Object, e As EventArgs) _
        Handles parentToolStripMenuItem.DropDownOpening
    'toolStripMenuItem1に現在の日付を表示する
    toolStripMenuItem1.Text = DateTime.Now.ToLongDateString()
    '1月の時は、toolStripMenuItem1にチェックマークをつける
    toolStripMenuItem1.Checked = DateTime.Now.Month = 1
    '日曜の時だけ、toolStripMenuItem1を有効にする
    toolStripMenuItem1.Enabled = DateTime.Now.DayOfWeek = DayOfWeek.Sunday
    '12時より前の時だけ、toolStripMenuItem2を表示する
    toolStripMenuItem2.Visible = DateTime.Now.Hour < 12
End Sub
C#
コードを隠すコードを選択
//parentToolStripMenuItemのDropDownOpeningイベントハンドラ
private void parentToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
{
    //toolStripMenuItem1に現在の日付を表示する
    toolStripMenuItem1.Text = DateTime.Now.ToLongDateString();
    //1月の時は、toolStripMenuItem1にチェックマークをつける
    toolStripMenuItem1.Checked = DateTime.Now.Month == 1;
    //日曜の時だけ、toolStripMenuItem1を有効にする
    toolStripMenuItem1.Enabled = DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
    //12時より前の時だけ、toolStripMenuItem2を表示する
    toolStripMenuItem2.Visible = DateTime.Now.Hour < 12;
}

.NET Framework 2.0以降で、ContextMenuStripコントロールを使用している場合

ContextMenuStripコントロールでは、ドロップダウンメニューが開く直前にOpeningイベントが発生しますので、この時にメニュー項目の設定を変更します。

なお、ドロップダウンメニューが開いた直後にはOpenedイベントが、ドロップダウンメニューが閉じる直前にはClosingイベントが、閉じた直後にはClosedイベントが発生します。

以下に例を示します。ここでは、フォームにContextMenuStripコントロール「contextMenuStrip1」がすでに配置されており、この中にメニュー項目「toolStripMenuItem1」と「toolStripMenuItem2」があるものとします。

VB.NET
コードを隠すコードを選択
'contextMenuStrip1のOpeningイベントハンドラ
Private Sub contextMenuStrip1_Opening(sender As Object, e As CancelEventArgs) _
        Handles contextMenuStrip1.Opening
    'toolStripMenuItem1に現在の時間を表示する
    toolStripMenuItem1.Text = DateTime.Now.ToLongTimeString()
    '日曜の時だけ、toolStripMenuItem2を有効にする
    toolStripMenuItem2.Enabled = DateTime.Now.DayOfWeek = DayOfWeek.Sunday
End Sub
C#
コードを隠すコードを選択
//contextMenuStrip1のOpeningイベントハンドラ
private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{
    //toolStripMenuItem1に現在の時間を表示する
    toolStripMenuItem1.Text = DateTime.Now.ToLongTimeString();
    //日曜の時だけ、toolStripMenuItem2を有効にする
    toolStripMenuItem2.Enabled = DateTime.Now.DayOfWeek == DayOfWeek.Sunday;
}

.NET Framework 1.1以前で、MainMenuコントロールを使用している場合

MainMenuコントロールの場合は、親メニューのPopupイベントハンドラ内でメニュー項目の設定を変更するようにすればよいでしょう。

次の例ではトップレベルメニュー項目MenuItem1の下に4つのメニュー項目MenuItem11、MenuItem12、MenuItem13、MenuItem14があり、これらのText、Enabled、Checked、Visibleプロパティを表示された日時により変更するようにしています。

VB.NET
コードを隠すコードを選択
'MenuItem1のPopupイベントハンドラ
Private Sub MenuItem1_Popup(ByVal sender As Object, _
        ByVal e As System.EventArgs) _
        Handles MenuItem1.Popup
    '現在の時間を取得
    Dim now As DateTime = DateTime.Now
    'MenuItem11のTextを現在の時間にする
    MenuItem11.Text = now.ToString()
    '30秒以下の時だけMenuItem12を有効にする
    MenuItem12.Enabled = now.Second < 30
    '秒が奇数の時MenuItem13にチェックマークを付ける
    MenuItem13.Checked = CBool(now.Second Mod 2)
    '日曜日以外の時MenuItem14が表示される
    MenuItem14.Visible = now.DayOfWeek <> DayOfWeek.Sunday
End Sub
C#
コードを隠すコードを選択
//MenuItem1のPopupイベントハンドラ
private void MenuItem1_Popup(object sender, System.EventArgs e)
{
    //現在の時間を取得
    DateTime  now= DateTime.Now;
    //MenuItem11のTextを現在の時間にする
    MenuItem11.Text = now.ToString();
    //30秒以下の時だけMenuItem12を有効にする
    MenuItem12.Enabled = now.Second < 30;
    //秒が奇数の時MenuItem13にチェックマークを付ける
    MenuItem13.Checked = Convert.ToBoolean(now.Second % 2);
    //日曜日以外の時MenuItem14が表示される
    MenuItem14.Visible = (now.DayOfWeek != DayOfWeek.Sunday);
}

.NET Framework 1.1以前で、ContextMenuコントロールを使用している場合

ContextMenuコントロールでは、MainMenuコントロールと同じように、ドロップダウンメニューが開く直前にPopupイベントが発生しますので、この時に子メニューの設定を変更します。

  • 履歴:
  • 2007/1/16 MenuStripの場合を追加。
  • 2009/2/4 ContextMenuとContextMenuStripコントロールの場合を追加。
  • 2014/5/26 題名を変更。MenuStripコントロールとContextMenuStripコントロールの説明にコードを追加など。

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

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