【发布时间】:2011-08-19 15:06:00
【问题描述】:
我有一个在运行时添加到面板的用户控件。有一个添加按钮可以继续向面板添加相同的用户控件。我的问题是,当您保存表单或清除表单时,清除用户控件(正确处理它们)的最佳方法是什么?我想删除从添加按钮添加的所有其他用户控件并清除第一个。
【问题讨论】:
-
请提供代码或具体示例..
-
我只是想要一个“最佳实践”。但是这两个中的任何一个都可以。谢谢。
我有一个在运行时添加到面板的用户控件。有一个添加按钮可以继续向面板添加相同的用户控件。我的问题是,当您保存表单或清除表单时,清除用户控件(正确处理它们)的最佳方法是什么?我想删除从添加按钮添加的所有其他用户控件并清除第一个。
【问题讨论】:
Control.ControlCollection.Remove 方法可以解决问题。在用户控件的容器上运行它。
例如,如果您的用户控件的类型是 YourUserControlType,并且您要从中删除用户控件的所有实例的容器是名为 panel1 的面板,则此代码应该可以工作:
var controlList = new List<YourUserControlType>(panel1.Controls.OfType<YourUserControlType>());
controlList.ForEach(c => {
panel1.Controls.Remove(c);
});
编辑: 适用于 .NET 2.0+
List<YourUserControlType> controlList = new List<YourUserControlType>();
for (int i = 0; i < panel1.Controls.Count; i++) {
YourUserControlType uc = panel1.Controls[i] as YourUserControlType;
if (uc != null) {
controlList.Add(uc);
}
}
foreach (YourUserControlType uc in controlList) {
panel1.Controls.Remove(uc);
}
请注意,在这两个版本中,我们都避免从控件集合中删除控件,因为我们正在迭代该集合。除非您很小心,否则在迭代时从集合中删除项目可能会导致问题。
【讨论】:
this.panel1.Controls.Clear(); 将删除集合中的所有控件。
由于您没有提供很多关于如何在运行时添加这些控件的具体细节,我假设您将它们实例化(使用 new),然后将它们添加到表单的 Controls 集合中。
删除那些运行时添加的控件的一种方法是将它们也添加到列表中,当您需要删除所有运行时控件时,只需遍历列表,为每个控件调用 MyForm.Controls.Remove(theControl)在列表中。通过在 List 上调用 Clear() 来完成。
干杯
【讨论】: