Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 添加和删除ToolStripMenuItem';WinForms中MenuStrip和DropDownItems中的_C#_Winforms_Menuitem - Fatal编程技术网

C# 添加和删除ToolStripMenuItem';WinForms中MenuStrip和DropDownItems中的

C# 添加和删除ToolStripMenuItem';WinForms中MenuStrip和DropDownItems中的,c#,winforms,menuitem,C#,Winforms,Menuitem,我有一些带有静态项的MenuStrip。我正在以编程方式向该菜单添加项。其中一些项具有子项(DropDownItems) 在某些时候,我想删除所有添加的项目,以重新创建具有不同项目的菜单。如何做对 示例情况: mainMenu -staticItem1 -added1 -added1_sub1 -added1_sub2 -added2 -added2_sub1 我可以做到: added1.Dispose(); mainMenu.Items.Remove(added2); 这

我有一些带有静态项的
MenuStrip
。我正在以编程方式向该菜单添加项。其中一些项具有子项(
DropDownItems

在某些时候,我想删除所有添加的项目,以重新创建具有不同项目的菜单。如何做对

示例情况:

mainMenu
 -staticItem1
 -added1
  -added1_sub1
  -added1_sub2
 -added2
  -added2_sub1
我可以做到:

added1.Dispose();
mainMenu.Items.Remove(added2);
这两种方法都有效,但我不确定是否安全。也许我应该一个一个递归地删除和处理所有项目和子项目?

  • 仅使用
    Remove
    方法,就足够了
  • 您不需要递归,当您删除父对象时,它的所有子对象都将被删除
  • 使用
    Items.Clear()
    删除菜单和菜单的所有子项
    DropDownItems.Clear()
    删除项目的所有子项

在反射器中,我看不到
移除
处理项目。我看到,处理一个项目将删除附加的事件,例如在项目单击时,因此该项目可以由GC收集。在对该集合调用
Remove
后,GC是否会收集该项?是的,在您的情况下,您不需要调用Dispose,当GC觉得方便时,该项将从内存中删除。确定,但我仍然想知道
单击
事件。我想我应该取消订阅这个活动,因为GC不会收集它。我说的对吗?不,您不需要取消订阅事件处理程序,因为此引用只是一种方式。因此,与事件处理程序相关的任何内容都不会停止GC。看起来您仍然担心,请检查read,阅读Dispose方法