
最近在看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
从后往前删…