Just a guess, have you tried clearing the shortcut key before deleting the
item?
Regard,
John
<(E-Mail Removed)> wrote in message
news:(E-Mail Removed)...
> Hi People
>
> I have a WinForm program. The UI contains a ToolStripDropdownButton,
> which is associate a list of menu items of ToolStripMenuItem, created
> dynamically. Upon different scenarios of user operations, the
> DropdowButton need to clean up all its menuitems, and create new ones.
>
> Here the codes:
> ////////////////////
> Void CreateForEmail()
> {
> ...
> button.DropDownItems.Clear();
> ...
> button.DropDownItems.Add("To:", null, HandleOutlookToClick);
> button.DropDownItems.Add("CC:", null, HandleOutlookCCClick);
> }
>
> Void CreateForPhone()
> {
> ...
> button.DropDownItems.Clear();
> ...
> button.DropDownItems.Add("Phone", null, HandlePhoneClick);
>
> }
>
> Void CreateForNone()
> {
> button.DropDownItems.Clear();
> }
> ////////////////////////
> So far so good, just work as I expect.
> Later on, I found out that " button.DropDownItems.Clear();" does not
> dispose the menu items at all, when I decided to add shortcutkeys to
> menu items. The above codes were changed in order to have shortCutKeys:
> ////////////////////
> Void CreateForEmail()
> {
> ...
> button.DropDownItems.Clear();
> ...
> button.DropDownItems.Add("To:", null, HandleOutlookToClick)
> .ShortcutKeys = Keys.F9;;
> button.DropDownItems.Add("CC:", null, HandleOutlookCCClick);
> }
>
> Void CreateForPhone()
> {
> ...
> button.DropDownItems.Clear();
> ...
> button.DropDownItems.Add("Phone", null, HandlePhoneClick) .ShortcutKeys
> = Keys.F9;;
>
> }
>
> Void CreateForNone()
> {
> button.DropDownItems.Clear();
> }
> ////////////////////////
>
> After CreateForNone is called, and I press F9, either
> HandleOutlookToClick or HandlePhoneClick will be called, depending
> which one was last called. Obviously, those menu items are still in the
> program accepting keyboard shortcut, though they are not invisible.
>
> So I replace "button.DropDownItems.Clear();" with the following
> ////////////////
> private void ClearButtonDropdown()
> {
> for (int i = Button.DropDownItems.Count - 1; i >= 0; i--)
> {
> ToolStripMenuItem m = Button.DropDownItems[i] as
> ToolStripMenuItem;
> Button.DropDownItems.Remove(m);
> m.Dispose();
> }
> Button.DropDownItems.Clear();
> // even GC.Collect() will not have effect.
> }
> ///////////////
> However, strange things remain the same.
> Obviously someone is still holding references to those menu items,
> stopping GC from disposing those items.
>
> Can you point out how to dispose these menu items?
>
> Cheers
>
>
> Andy
>
|