The correct way to get the owner toolstrip of a toolstrip item in .net, winforms
I found that while trying to find the owning toolstrip of an item, it wasn't开发者_高级运维 a easy as just looking at the owner of the item. Below is some pseudo code that I think should work. Can anyone see any problems with this or should it work in all cases?
(1) Is type of Item.Owner a ToolStrip?
(2) Yes, Return Item.Owner
(3) No, Item = Item.OwnerItem. Go to (1).
ETA:
I'd like to make the test a general test. So instead of testing for ToolStrip, I should be testing for ToolStrip, MenuStrip, StatusStrip or ContextMenuStrip.
What makes the 4 mentioned above different to other ToolStrip derived controls such as ToolStripDropDown, ToolStripDropDownMenu and ToolStripOverflow?
ETA2: Ignore, absolute carp!
As far a I can tell, it's something to do with Control.TopLevelControl. The 3 controls above that can't be added to a form return a TopLevelControl of themselves. The 4 valid controls return nothing for TopLevelControl, before being added to a form, and then the form itself, after being added.
This worked:
ToolStrip owner = testToolStripMenuItem.Owner;
while (owner is ToolStripDropDownMenu)
owner = (owner as ToolStripDropDownMenu).OwnerItem.Owner;
If you are handling a click event for a drop down menu item as follows:
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;
}
Try item.Parent instead of item.Owner.
精彩评论