动态生成控件,用Controls.remove()删除不干净

wangmin2659 2018-04-26 11:18:39
各位大侠,请帮忙看下以下代码:

目标,通过点击按钮动态生成控件,然后再通过点击另外一个按钮,删除这些生成的控件

需要点击多次才能删除干净




// 点击button2生成6个控件,点击button1第一次删除3个,第二次删除2个,第三次才能全部删除完。

private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i <= 5; i++)
{
PanelDay kk = new PanelDay(); //用户自定义控件,换成button效果一样
kk.Name = "nn" + i;
kk.Location = new Point(20 + i * 55, 20);
Controls.Add(kk);
}
}


private void button1_Click(object sender, EventArgs e)
{
foreach (Control i in this.Controls)
{
if (i is PanelDay) //PanelDay是用户自定义控件
Controls.Remove(i);
}
}

...全文
836 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不要用foreach去删除
Dogfish 2018-04-27
  • 打赏
  • 举报
回复
正在工作中的好像不能正常删除。
Jason_Mao1 2018-04-27
  • 打赏
  • 举报
回复
这个问题我也遇到过,就是删除不干净,我当时是写了10 个循环 删除10 遍,你试试吧,暂时没有好的方法。
  • 打赏
  • 举报
回复
#1 楼已经给出了示例,在
foreach (Control i in this.Controls)
这里,“in”后边应该使用一个集合copy不变副本,而不是直接使用 Controls。
  • 打赏
  • 举报
回复
每次移除集合中的第一项,循环这个集合的长度,就可以全部删除了
  • 打赏
  • 举报
回复
移除之后强制重新绘制UI。
assky124 2018-04-27
  • 打赏
  • 举报
回复
在foreach 中改变 集合本来就不对,你集合都变了,循环的时候有些对象就访问不到了
csdnFUCKINGSUCKS 2018-04-27
  • 打赏
  • 举报
回复
private void button1_Click(object sender, EventArgs e)
{
    List<Control> controlsToDelete = new List<Control>();

    foreach (var item in Controls)
    {
        if (item is PanelDay)
        {
            controlsToDelete.Add(item as PanelDay);
        }
    }

    foreach (var item in controlsToDelete)
    {
        Controls.Remove(item);
    }
}
0 1看天下 2018-04-27
  • 打赏
  • 举报
回复
不报错?
threenewbee 2018-04-26
  • 打赏
  • 举报
回复
foreach (Control i in this.Controls) { if (i is PanelDay) //PanelDay是用户自定义控件 Controls.Remove(i); } -> foreach (Control i in this.Controls.OfType<PanelDay>().ToList()) Controls.Remove(i);

111,125

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧