我试图删除Winform面板中包含的所有控件,但它们根本不想删除-其中一些已删除,而另一些则没有。 我已经尝试了2种方法,但一无所获:

  1. 前言

     foreach (Control controlEntry in this.contentsPanel.Controls) { this.contentsPanel.Controls.Remove(controlEntry); } 
  2. 对于

     for (int i = 0; i < this.contentsPanel.Controls.Count; i++) { this.contentsPanel.Controls.RemoveAt(i); } 

为什么会这样呢?

===============>>#1 票数:15 已采纳

您必须当心这样的代码,像这样从其容器中删除控件会导致不可恢复的资源泄漏。 Controls.Remove / At()或其他发布者建议的Controls.Clear()方法将从集合中删除控件,并将其重新托管到“停车窗口”。 否则看不见的窗口,原生窗口无需破坏即可找到好客的住所。 准备好重新托管在另一个父级上。

这是陷阱,您通常不会将其移动到另一个父对象。 该控件将继续保留在停车窗口中,从而消耗本机Windows资源。 垃圾收集器无法恢复这些资源。 最终,当Windows拒绝为您的进程提供更多窗口时,您的程序将崩溃。 异常消息将显示“错误创建句柄”。

而是,您必须处置控件。 这也会自动将控件从其父控件中删除。 正确的代码是:

 while (contentsPanel.Controls.Count > 0) contentsPanel.Controls[0].Dispose();

或者,如果您发现这看起来太奇怪了,请向后迭代。

===============>>#2 票数:8

每次从集合中删除控件时,集合都会更改。 当您删除Controls第一个元素时,第二个元素将变为第一个,因此,当您继续删除第二个控件时,实际上是从原始集合中删除了第三个元素(跳过第二个元素)。

如果要删除集合中包含的所有控件,请使用this.contentsPanel.Controls.Clear() 如果要通过ControlCollection的索引删除控件,请首先选择要删除的控件以分离列表或数组,然后再删除它们。

===============>>#3 票数:4

如果您想全部删除,那就去做吧

this.contentsPanel.Controls.Clear()

===============>>#4 票数:3

因为您正在更改集合,所以foreach将失败,这会破坏迭代器。

for失败,因为您仅删除了其他所有项目; 考虑:i = 0,您删除第零项。 现在, 作为项目1的项目是项目0-因此,当您删除项目1(下一个循环迭代)时,您跳了一个。

简短版本:使用Clear()

contentsPanel.Controls.Clear();

较长的版本:向后迭代:

for(int i=contentsPanel.Controls.Count-1; i>=0;i--) {
   contentsPanel.Controls.RemoveAt(i);
}

第一个(清除)比较简单。

  ask by Patryk translate from so

未解决问题?本站智能推荐:

1回复

删除关联的控件[关闭]

WinForm上有一个TreeView控件,它代表一组层次结构的对象。 每个对象都有某些类的对象集。 有DataGridView ,它表示与所选TreeView节点关联的对象。 通过双击TabControl1上DataGridView的DataRow ,可TabPage带有DataGrid
1回复

删除SplitContainer而不删除其他控件

我简直不敢相信我找不到答案.... 我不再需要在WinForms UI中使用SplitContainer。 但每当我删除SplitContainer时,我也失去了所有其他控件 - 按钮,标签,文本框和图表。 SplitContainer中的任何内容也会被删除。 很烦人。 删除S
2回复

如何删除按钮或其他控件的事件?

我已经创建了按钮的button_click事件,还有 偶然地..现在我在表单上有该代码,如何删除它? 我已经尝试过将其作为简单文本删除,但是它不起作用。我有什么办法可以删除它?
2回复

从月份日历控件中删除选定的日期

在我的表单上,我有一个清除按钮,该按钮应该将表单重置为原始设置,因此,我需要取消选择用户在我的月历中选择的任何日期,但是无法弄清楚该如何做。 。 因此,有没有办法删除用户在月历上选择的所有日期?
1回复

从面板中删除控件不会将其从窗体中删除吗?

我有一个例程,我循环遍历表单上的所有控件,并处理其中一些代码。 我根据用户的选择通过使用屏幕添加和删除控件。 我发现panel.Controls.Remove(control1)实际上并没有从表单中删除它。 当我运行通过窗体上的控件递归循环的例程时,仍然可以找到我以为已删除的控件。
3回复

如何从Windows窗体中删除默认控件按钮

图像描述了我想要做的事情。 我有一个“连接四”游戏,运行得很好,但我想删除窗口右上角提供的默认按钮。 有什么快速帮助吗?
2回复

从具有不同父级的列表中删除控件

我试图动态删除控件,而又不知道其父级。 但是在调试时,我在mscorlib.dll中不断收到“ System.NullReferenceException”。 我的代码: 我在这里想念什么? 我正在监督明显的事情吗? 提前致谢!
1回复

添加/删除具有相同参考名称的控件

当用户单击按钮时,我一个接一个地在面板上添加控件。 控件在面板上一个接一个显示。 当面板已满时(例如十个),添加的下一个控件必须替换添加的第一个控件,但是首先我需要删除第一个控件。...问题是正在创建的所有控件都具有相同的引用例如“ pic”,现在当我使用panel1.Controls.Re
4回复

C#删除尚未添加的控件

在C#Windows窗体中,我正在创建一些动态控件: 基于此后运行的某些if语句,即使在将它们添加到表单之前,我也需要删除3个控件中的2个。 如果我尝试这个 它行不通,大概是因为他们尚未实际控制。 那么我还能如何销毁它们呢? 我需要删除它们的原因是因为在上述情况下,我还没有
3回复

如何在WinForms中删除容器控件上的边框填充?

我将margin和padding设置为0 0 0 0,但这对我的TabControls没有任何影响。 看: 这就是我所说的。 我想把边界粘在一起。 我怎样才能做到这一点? @Henk Holterman - 是的,它有什么问题?