从容器中删除控件的最简洁方法是什么?

Ily*_*gan 3 .net c# winforms

我有一个WinForms性能问题可能与我动态添加然后删除数百个控件有关.

编辑{ 应用程序显示一个时间轴,其中包含表示历史事件的控件.根据您跳转的时间添加,删除或移动控件.性能问题不仅在控件的添加和删除期间(我可以忍受),但即使在我跳转到没有历史事件的时间(意味着当前没有显示控件).在跳转并到达时间线上没有事件的时间之后,GUI中的一些活动仍然需要很长时间才能完成,例如打开菜单或打开对话框.奇怪的是,其他GUI活动,如按下按钮,不会停止.}

虽然内存消耗非常稳定,但仍然存在释放资源的问题吗?

为了删除控件,我做了两件事:

  1. 取消注册所有事件的回调,
  2. 打电话containerPanel.Controls.Remove(control).

谢谢!

Dan*_*rth 6

正如您已经观察到的那样,这不是内存问题.我的猜测是,问题是一个简单的事实,你的程序需要经常刷新屏幕.如果您在一个批次中删除并添加"数百个控件",则可以尝试禁用屏幕刷新,直到完成为止.
您可以使用SuspendLayout和执行此操作ResumeLayout:

SuspendLayout();
for(...)
    AddControl(...);
ResumeLayout();
Run Code Online (Sandbox Code Playgroud)

SuspendLayout();
for(...)
    RemoveControl(...);
ResumeLayout();
Run Code Online (Sandbox Code Playgroud)

  • 为SuspendLayout +1 这几乎可以肯定他所需要的.另外,我想知道如此频繁地添加/删除的控件是否可以自己分组在[`Panel`]中(http://msdn.microsoft.com/en-us/library/system.windows. forms.panel.aspx)(或其他一些容器),以便它们可以作为单个控件(`Panel`)删除,并且替换可以作为新的`Panel`添加?这应该有助于简化事情(如果还没有完成)(从容器中添加/弹出一个控件而不是很多;显然,添加代码仍然需要存在于`Panel`本身). (3认同)