大神请进----------为什么我的清空动态生成的组件,少了一次循环?

雄牛 2016-12-27 11:54:43

是这样,我有一个动态生成PictrueBox的方法,全部放在MapArea这个panel下,
但是要清空时,当PictureBox数量大于1的时候,后面就会少了一个循环,
也就是清不干净

我换了for循环也是一样,到底是什么原因呢?




//生成图像组件代码
PictureBox pb = new PictureBox();
pb.Name = name;
pb.Location = new Point(locX, locY);
pb.BackColor = Color.LightBlue;
pb.ImageLocation =strFilepath;
pb.Tag = 0;// nameX;//预设值等于自增
MapArea.Controls.Add(pb);
pb.Parent = this.MapArea;



//清空图片区子成员
public void ClearMap()
{

foreach (Control picBox in this.MapArea.Controls)
{
if (picBox is PictureBox)
{
if (picBox.Name != "BgImg")
{
PictureBox pb = picBox as PictureBox;
MapArea.Controls.Remove(pb); //移除它
}
}
}
}
...全文
232 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sy401042879 2016-12-29
  • 打赏
  • 举报
回复
多调试两回就可以了,进来领个分。
闭包客 2016-12-28
  • 打赏
  • 举报
回复
进来看看大神都在聊什么……
token不能为空 2016-12-28
  • 打赏
  • 举报
回复
你这段代码没有报错吗 我之前尝试在遍历时候删除元素直接就报错了啊
巴士上的邂逅 2016-12-27
  • 打赏
  • 举报
回复
我都是定义一个集合存放控件,删除时foreach这个集合,再清除panel.Controls删除过的control
  • 打赏
  • 举报
回复
集合被改变了,还怎么保证 foreach ?
雄牛 2016-12-27
  • 打赏
  • 举报
回复
可以了,我加了一句: i--;
  • 打赏
  • 举报
回复

                for (int i = this.MapArea.Controls.Count; i > 0; i--)
                {
                    if (picBox is PictureBox)
                    {
                        if (picBox.Name != "BgImg")
                        {
                            PictureBox pb = picBox as PictureBox;
                            MapArea.Controls.Remove(pb);  //移除它
                        }
                    }
                }
正怒月神 版主 2016-12-27
  • 打赏
  • 举报
回复
删除过集合后,导致集合数量改变,引发了下标变化的问题
private void Form1_Load(object sender, EventArgs e)
        {
            //测试数据
            this.panel1.Controls.Add(new Label() { Top = 10, Text = "1111",Width=20,Height=20 });
            this.panel1.Controls.Add(new Label() { Top = 30, Text = "2222", Width = 20, Height = 20 });
            this.panel1.Controls.Add(new Label() { Top = 50, Text = "3333", Width = 20, Height = 20 });
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i=0;i<this.panel1.Controls.Count;i++)
            {
                if (((Label)this.panel1.Controls[i]).Text != "2222")
                {
                    this.panel1.Controls.Remove(this.panel1.Controls[i]);
                    i = 0;        //删除后,重置索引
                }

            }

        }
吉普赛的歌 2016-12-27
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.IO;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>() { 0,1,2,3,4,5,6,7,8,9 };
List<int> list2 = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Console.WriteLine("---- list ----");
try
{
foreach (int i in list)
{
if (i % 2 == 0)
{
Console.WriteLine("list:{0} has been removed.", i);
list.Remove(i);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.WriteLine("---- list2 ----");
for(int i=list2.Max();i>=0;i--)
{
if (i % 2 == 0)
{
Console.WriteLine("list2:{0} has been removed.", i);
list.Remove(i);
}
}
Console.Read();
}
}
}

用 for , 反向循环就可以了
雄牛 2016-12-27
  • 打赏
  • 举报
回复
引用 1 楼 sp1234 的回复:
集合被改变了,还怎么保证 foreach ?
请问怎么改?
雄牛 2016-12-27
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
没有提示你集合在枚举的时候,不能被修改吗? 否者迭代器无效!
没有提示啊,那我的代码应该怎么修改?
Saleayas 2016-12-27
  • 打赏
  • 举报
回复
没有提示你集合在枚举的时候,不能被修改吗? 否者迭代器无效!

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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