gpt4 book ai didi

c# - C#中的tabcontrol页面清空所有控件

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:48 32 4
gpt4 key购买 nike

我有一个标签页,其中包含文本框、下拉菜单、复选框,以及以上所有的组合框和一些标签。现在我想在用户单击按钮时清除所有控件。我应该如何实现它?我搜索了很多,认为会有一个标准的库方法。我发现的只是一些带有 for-each 循环的方法(在组框中不起作用。)请指导我如何处理这个问题。基本上我想要一个像 Tabpage.load(); 这样的方法。将选项卡恢复到初始状态。如果可能的话,我想保留特定的文本框。

最佳答案

很多 Winforms 程序员都弄错了这种代码。到目前为止,您得到的答案也不异常(exception)。 Controls.Clear() 和 Controls.Remove() 方法非常危险。这些方法按预期从其父级移除控件,但它们不会处置控件。它们被重新托管在名为“ParkingWindow”的内部隐藏窗口中。使 native 窗口保持事件状态,准备好移动到另一个父窗口。

这是一个非常不错的功能,但不幸的是,它是无法控制的窗口句柄泄漏的主要来源。因为,到目前为止,实际意图是处置它们,而不是重新托管它们。要永久删除控件,您必须使用它们的 Dispose() 方法。这也会自动将它们从控件集合中删除。

这是第二个陷阱,您不能使用 foreach 来迭代控件集合。这仅处理偶数编号的控件,这是集合被 foreach 循环修改的副作用。您必须像这样向后迭代它:

    public static void UnloadTabpage(TabPage page) {
for (int ix = page.Controls.Count - 1; ix >= 0; --ix) {
page.Controls[ix].Dispose();
}
}

此外,不要像 Justin 那样递归。处置控件也会自动处置该控件的所有子控件。可能是你的group box的问题,不是很清楚。

只是为了好玩,这是另一个真正插入这一点的实现:

    public static void UnloadTabpage(TabPage page) {
while (page.Controls.Count > 0) page.Controls[0].Dispose();
}

但这并不容易让您有选择地删除控件,就像您提到的那样。

关于c# - C#中的tabcontrol页面清空所有控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12404540/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com