You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确释放WinForms中动态创建的所有控件?

问题排查与解决

你的代码错误点

  1. 遍历集合时修改原集合导致遍历中断
    使用foreach遍历frm.Controls的同时执行Remove操作,会触发枚举器失效,遍历过程会提前终止,因此只能删除部分控件。

  2. 移除控件的目标集合错误
    你使用this.Controls.Remove(control),但动态按钮是添加在frm(Form2)的控件集合中,这行代码无法从Form2中移除控件,属于无效操作。


修正后的基础版本代码

private void btnDisposeAll_Click(object sender, EventArgs e)
{
    // 将控件集合转为数组,避免遍历原集合时修改引发的异常
    foreach(Control control in frm.Controls.Cast<Control>().ToArray())
    {
        // 若Form2上有其他原生控件,可通过类型判断仅删除动态按钮
        if (control is Button)
        {
            frm.Controls.Remove(control);
            control.Dispose();
        }
    }
}

更精准的优化方案(避免误删原生控件)

如果Form2本身存在默认控件,建议在创建动态按钮时单独维护一个列表,确保只删除你创建的按钮:

1. 在Form1中添加列表存储动态按钮

Form frm = new Form2();
// 专门存储动态创建的按钮
List<Button> dynamicButtons = new List<Button>();

public Form1()
{
    InitializeComponent();
}

2. 创建按钮时加入列表

private void btnCreateButtons_Click(object sender, EventArgs e)
{
    for (int t=0;t<10;t++)
    {
        Button button = new Button();
        button.Text = "Button " + t.ToString();
        button.Location = new Point(10, (10+(button.Height*t)));
        frm.Controls.Add(button);
        // 添加到维护列表
        dynamicButtons.Add(button);
    }
}

3. 释放时遍历列表处理

private void btnDisposeAll_Click(object sender, EventArgs e)
{
    foreach(Button btn in dynamicButtons)
    {
        frm.Controls.Remove(btn);
        btn.Dispose();
    }
    // 清空列表,避免重复释放
    dynamicButtons.Clear();
}

内容的提问来源于stack exchange,提问作者Mehdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:27:54