views:

351

answers:

3

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.

A: 

Try item.Parent instead of item.Owner.

Steve Danner
item.Parent returns nothing.
Jules
+1  A: 

This worked:

        ToolStrip owner = testToolStripMenuItem.Owner;
        while (owner is ToolStripDropDownMenu)
            owner = (owner as ToolStripDropDownMenu).OwnerItem.Owner;
Hans Passant
Hi, thanks for that. Can you have a look at my eta and see how this could work for any valid toolstrip derived control. Cheers.
Jules
A: 

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;
 }
Michael
Hi, that won't work. You can nest sideways and have multiple ToolStripDropDown menus. You need to do a loop like my pseudo code or nobugz example.
Jules
Ah, I see what you're saying for nested DropDown menu items.
Michael