我有一个标签页,其中包含文本框,下拉菜单,复选框,以上所有组框和一些标签.现在我想在用户点击按钮时清除所有控件.我该如何实施呢?我搜索了很多,以为会有一个标准的库方法.我找到的只是一些for-each循环的方法(在组合框中不起作用.)请指导我如何处理这个问题.基本上我想要像Tabpage.load(); 它使标签处于初始状态.如果可能,我想保留特定的文本框.
很多Winforms程序员都错了这种代码.你到目前为止得到的答案也不例外.Controls.Clear()和Controls.Remove()方法非常危险.这些方法按预期从父级中删除控件,但它们不会释放控件.它们被重新托管在名为"ParkingWindow"的内部隐藏窗口上.要使本机窗口保持活动状态,请准备好移动到另一个父窗口.
这是一个非常好的功能,但不幸的是,无法控制的窗口手柄泄漏的主要来源.因为到目前为止,实际意图是处置它们,而不是重新托管它们.要永久删除控件,必须使用Dispose()方法.这也会自动从Controls集合中删除它们.
哪个是第二个陷阱,你不能使用foreach来迭代Controls集合.只处理偶数编号的控件,这个集合的副作用会被foreach循环修改.你必须反向迭代它,如下所示:
public static void UnloadTabpage(TabPage page) {
for (int ix = page.Controls.Count - 1; ix >= 0; --ix) {
page.Controls[ix].Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
另外,千万不能递归像贾斯汀一样.处置控件也会自动处理该控件的所有子控件.也许你的群组问题,它不是很清楚.
只是为了踢,这是另一个真正推动回家的实现:
public static void UnloadTabpage(TabPage page) {
while (page.Controls.Count > 0) page.Controls[0].Dispose();
}
Run Code Online (Sandbox Code Playgroud)
但这并不容易让你有选择地删除控件,就像你提到的那样.