Есть несколько проблем с вашим кодом.
первый. Элементы MenuStrip не являются дочерними для Item, поэтому HasChildren вернет false. Вместо этого они находятся в коллекции Items в MenuStrip. Вам нужно специально обработать вхождение MenuStrip.
Добавьте следующий код в метод AddEvents ... ниже:
(snip...)
// old code
if (control.HasChildren)
AddEventsToAllControls(control);
//add new code below
if (control is MenuStrip) {
MenuStrip ms = control as MenuStrip;
AddEventsToAllToolStripMenuitems(ms.Items);
}
И добавьте новый метод следующим образом:
private void AddEventsToAllToolStripMenuitems (ToolStripItemCollection items) {
foreach (ToolStripItem tsi in items) {
tsi.MouseEnter += new EventHandler(this.control_MouseEnter);
tsi.MouseLeave += new EventHandler(this.control_MouseLeave);
if (tsi is ToolStripMenuItem) {
ToolStripMenuItem mi = tsi as ToolStripMenuItem;
AddEventsToAllToolStripMenuitems(mi.DropDownItems);
}
}
}
второй. ToolStripItem не является производным от Control, поэтому в MouseEnter отправитель как оператор Control завершится ошибкой (control будет нулевым) Сделайте что-то вроде этого:
Control control = sender as Control;
if (control != null && control.Tag != null && control.Tag.ToString().Length > 0)
this.toolStripStatusLabel1.Text = control.Tag.ToString();
ToolStripItem tsi = sender as ToolStripItem;
if (tsi != null && tsi.Tag != null && tsi.Tag.ToString().Length > 0)
this.toolStripStatusLabel1.Text = tsi.Tag.ToString();
(я также добавил несколько нулевых проверок)
Это должно помочь вам.