メニューに表示する項目のテキストをその時の状況によって変更したいというケースがあります。同じように、その時の状況によって、メニュー項目の無効化、チェックのオンオフ、項目の追加や削除など、メニュー項目の状態を変更したいというケースもあります。このような時は、メニュー項目が表示される直前にメニュー項目の状態を変更するとよいでしょう。ここでは、その方法を説明します。
.NET Framework 2.0から追加されたMenuStripコントロールの場合は、メニュー項目が表示される直前(ドロップダウンメニューが表示される直前)に、その親であるメニュー項目でToolStripMenuItem.DropDownOpeningイベントが発生します。
なおドロップダウンメニューが表示された直後にはDropDownOpenedイベントが、ドロップダウンメニューが閉じた直後にはDropDownClosedイベントが発生します。
現在の日時によってメニュー項目の状態を変更する例を以下に示します。この例では、MenuStripコントロールに親となる項目「parentToolStripMenuItem」がすでにあり、その子項目として「toolStripMenuItem1」と「toolStripMenuItem2」があるものとします。
'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
//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; }
ContextMenuStripコントロールでは、ドロップダウンメニューが開く直前にOpeningイベントが発生しますので、この時にメニュー項目の設定を変更します。
なお、ドロップダウンメニューが開いた直後にはOpenedイベントが、ドロップダウンメニューが閉じる直前にはClosingイベントが、閉じた直後にはClosedイベントが発生します。
以下に例を示します。ここでは、フォームにContextMenuStripコントロール「contextMenuStrip1」がすでに配置されており、この中にメニュー項目「toolStripMenuItem1」と「toolStripMenuItem2」があるものとします。
'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
//contextMenuStrip1のOpeningイベントハンドラ private void contextMenuStrip1_Opening(object sender, CancelEventArgs e) { //toolStripMenuItem1に現在の時間を表示する toolStripMenuItem1.Text = DateTime.Now.ToLongTimeString(); //日曜の時だけ、toolStripMenuItem2を有効にする toolStripMenuItem2.Enabled = DateTime.Now.DayOfWeek == DayOfWeek.Sunday; }
MainMenuコントロールの場合は、親メニューのPopupイベントハンドラ内でメニュー項目の設定を変更するようにすればよいでしょう。
次の例ではトップレベルメニュー項目MenuItem1の下に4つのメニュー項目MenuItem11、MenuItem12、MenuItem13、MenuItem14があり、これらのText、Enabled、Checked、Visibleプロパティを表示された日時により変更するようにしています。
'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
//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); }
ContextMenuコントロールでは、MainMenuコントロールと同じように、ドロップダウンメニューが開く直前にPopupイベントが発生しますので、この時に子メニューの設定を変更します。