gpt4 book ai didi

c# - 如何处理动态创建的控件?

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

我正在 TabPages 之上动态创建控件,当然,这些控件位于 TabControl 上。我也希望能够动态处理这些。我怎样才能做到这一点?在 TabControl 的 TabPages 集合上调用 Clear 实际上会处理 TabPages 本身,这违背了在这些页面上使用动态创建的新控件“重新开始”的目的。

调用 tabPageBla.Controls.Clear() 与我想要的很接近,但它还会在我需要保留的每个 TabPage (FlowControlLayout) 上配置一个容器控件。

是否有一种直接的方法来完成此操作(仅处理动态创建的控件,而不处理其他任何控件)?

更新

这行得通吗 - 是否还会找到 TabControl1 的孙代(标签页的子代)?:

List<Control> ctrls = new List<Control>();
ctrls.AddRange(tabControl1.Controls);
foreach (var ctrl in ctrls)
{
// Controls named "panelRowBla", "richTextBoxBla", and "pictureBoxBla" need to be retained
string ctrlName = ctrl.Name;
if ((ctrlName.Contains("panelRow")) ||
(ctrlName.Contains("richTextBox")) ||
(ctrlName.Contains("pictureBox")))
{
continue;
}
}

更新 2

这很奇怪;我本可以发誓这只是编译,但现在我收到“参数 1:无法从‘System.Windows.Forms.Control.ControlCollection’转换为 System.Collections.Generic.IEnumerable’

(在“AddRange()”行)。

最佳答案

如果你从父级移除控件,你可以显式地Dispose它,即:

 parent.Controls.Remove(theControl);
((IDisposable)theControl).Dispose();

鉴于您的编辑,您应该能够:

var toRemove = tabControls1
.Controls
.Cast<Control>()
.Where(c => !(c.Name.Contains("panelRow") || c.Name.Contains("richTextBox") || c.Name.Contains("pictureBox")))
.ToList();

foreach(var c in toRemove)
{
tabControls1.Controls.Remove(c);
((IDisposable)c).Dispose();
}

这将从 tabControl1 中删除所有与您的过滤器不匹配的控件。

关于c# - 如何处理动态创建的控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24022333/

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