![C# 动态删除按钮的时候只删除一半,求指导 C# 动态删除按钮的时候只删除一半,求指导](https://www.codebye.com/wp-content/uploads/2016/07/-383879815-322672078.gif)
最近在看C#1200实例,王小科那个,话说不是很适合本人这种新手,硬着头皮写了看了下去…
直接上源码了,有两个问题
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace 多线程游戏 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int G_int_num; private void btn_Star_Click(object sender, EventArgs e) { Random G_Random=new Random(); G_int_num = G_Random.Next(1, 100); //随机数产生器 int p_int_x = 10; //设置开始坐标 int p_int_y = 60; for (int i = 0; i < 100; i++)//动态生成100个按钮 { Button bt = new Button(); bt.Text = (i + 1).ToString(); bt.Name = (i + 1).ToString(); bt.Width = 35; bt.Height = 35; bt.Location = new Point(p_int_x, p_int_y); bt.Click += new EventHandler(bt_click); p_int_x += 36; if ((i + 1) % 10 == 0) { p_int_x = 10; p_int_y += 36; } Controls.Add(bt); //新建一个线程 后台线程 //动态计时器 Thread G_th = new System.Threading.Thread(delegate() { int p_int_count = 0; while (true) //前台线程 { p_int_count = ++p_int_count > 100000000 ? 0 : p_int_count; this.Invoke((MethodInvoker)delegate { lbl_Time.Text = p_int_count.ToString(); }); System.Threading.Thread.Sleep(1000); } G_th.IsBackground = true; G_th.Start(); btn_Star.Enabled = false; }); } lbl_Random.Text = G_int_num.ToString(); } private void bt_click(object sender, EventArgs e) { Button btn =(Button)sender; if (Convert.ToInt32(btn.Text.ToString()) == G_int_num) { MessageBox.Show("恭喜你中奖了!"); } else { btn.BackColor=System.Drawing.Color.Black; } } private void btn_Clear_Click(object sender, EventArgs e)//动态删除按钮 { int tmp; foreach (Control c in this.Controls) { if(c is Button) { if(int.TryParse(c.Name,out tmp)) { c.Dispose(); } } /* if(Convert.ToInt32(c.Name.ToString())<100&&Convert.ToInt32(c.Name.ToString())>0) { } */ } } } }
问题出在 删除按钮那部分代码,不是应该直接删除全部符合条件的按钮吗,为何只删除了一半.
还有就是动态计时器部分不起作用,讲star()移到外面之后,运行没问题,关闭的时候会出现假死情况…5秒后恢复正常
另外再求一本适合有一点点,一点点基础的C#实例书籍….百度上找了很多都不是很适合
解决方案
40
通过for循环删除,从i = controls.count开始,每次i的值减1
5
你这样写没报错?虽然你是调用了Dispose,但本质还是在foreach的时候执行了delete操作,改变了被遍历的集合
5
Dispose实在foreach内部执行的,执行之前就已经进行了delete操作,改变了集合。
5
剩下的那一半按钮的 c.name 的值假如是2,4,6,8……..那么,就是说明楼上的说法是正确的,这种情况适合用出栈或出队的方法删除
5
从后往前删…