A
Andy Lotus
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 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
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 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