Правильный способ получить панель инструментов владельца элемента панели инструментов в .net, winforms

Я обнаружил, что при попытке найти панель инструментов владельца элемента было не так просто, как просто посмотреть на владельца элемента. Ниже приведен некоторый псевдокод, который, я думаю, должен работать. Может ли кто-нибудь увидеть какие-либо проблемы с этим или он должен работать во всех случаях?

(1) Является ли тип Item.Owner ToolStrip?

(2) Да, вернуть товар.Владелец

(3) Нет, Предмет = Предмет.Владелец. Перейти к (1).

Расчетное время прибытия:

Я хотел бы сделать тест общим тестом. Поэтому вместо тестирования ToolStrip я должен тестировать ToolStrip, MenuStrip, StatusStrip или ContextMenuStrip.

Чем 4 упомянутых выше элемента отличаются от других производных элементов управления ToolStrip, таких как ToolStripDropDown, ToolStripDropDownMenu и ToolStripOverflow?

ETA2: Не обращай внимания, абсолютный карп!

Насколько я могу судить, это как-то связано с Control.TopLevelControl. 3 элемента управления выше, которые нельзя добавить в форму, возвращают TopLevelControl самих себя. Четыре допустимых элемента управления ничего не возвращают для TopLevelControl до добавления в форму, а затем для самой формы после добавления.


person Jules    schedule 12.02.2010    source источник
comment
Это ToolStripItem? Свойство Owner объекта ToolStripItem возвращает объект ToolStrip. Это не работает?   -  person Jacob G    schedule 13.02.2010
comment
Это ToolStripMenuItem, принадлежащий ToolStripDropDownButton. Однако при добавлении определенных элементов, таких как DropDownButton, кажется, что создается невидимый элемент ToolStripDropDownMenu, производный от ToolStrip. Это то, что возвращается, когда вы смотрите на владельца. Владелец ToolStripDropDownMenu ничто.   -  person Jules    schedule 13.02.2010


Ответы (3)


Это сработало:

        ToolStrip owner = testToolStripMenuItem.Owner;
        while (owner is ToolStripDropDownMenu)
            owner = (owner as ToolStripDropDownMenu).OwnerItem.Owner;
person Hans Passant    schedule 12.02.2010
comment
Привет, спасибо за это. Можете ли вы взглянуть на мой eta и посмотреть, как это может работать для любого действительного элемента управления, производного от панели инструментов. Ваше здоровье. - person Jules; 13.02.2010
comment
Если вы используете ContextMenuStrip, то вышеперечисленное необходимо изменить на while (owner is ToolStripDropDownMenu && !owner is ContextMenuStrip), поскольку ContextMenuStrip наследуется от ToolStripDropDownMenu. - person NiKiZe; 29.03.2017

Если вы обрабатываете событие щелчка для элемента раскрывающегося меню следующим образом:

 private void testItemToolStripMenuItem_Click(object sender, EventArgs e)
 {
    ToolStripDropDownItem item = sender as ToolStripDropDownItem;
    ToolStripDropDown menu = item.DropDown;
    ToolStripItem ownerItem = item.OwnerItem;
    ToolStrip toolStrip = item.Owner;
 }
person Michael    schedule 12.02.2010
comment
Привет, это не сработает. Вы можете вкладываться сбоку и иметь несколько меню ToolStripDropDown. Вам нужно сделать цикл, как мой псевдокод или пример nobugz. - person Jules; 13.02.2010
comment
А, я понимаю, что вы говорите о вложенных пунктах меню DropDown. - person Michael; 13.02.2010

Попробуйте item.Parent вместо item.Owner.

person Steve Danner    schedule 12.02.2010