C# 动态删除按钮的时候只删除一半,求指导

.Net技术 码拜 9年前 (2016-03-06) 1007次浏览
C# 动态删除按钮的时候只删除一半,求指导
最近在看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)
                {
                    
                }
                */
            }
        }
        
        
       
    }
}

问题出在  删除按钮那部分代码,C# 动态删除按钮的时候只删除一半,求指导不是应该直接删除全部符合条件的按钮吗,为何只删除了一半.
还有就是动态计时器部分不起作用,讲star()移到外面之后,运行没问题,关闭的时候会出现假死情况…5秒后恢复正常
C# 动态删除按钮的时候只删除一半,求指导
另外再求一本适合有一点点,一点点基础的C#实例书籍….百度上找了很多都不是很适合

解决方案

40

通过for循环删除,从i = controls.count开始,每次i的值减1

5

你这样写没报错?虽然你是调用了Dispose,但本质还是在foreach的时候执行了delete操作,改变了被遍历的集合

5

Dispose实在foreach内部执行的,执行之前就已经进行了delete操作,改变了集合。

5

引用 5 楼 starfd 的回复:

你这样写没报错?虽然你是调用了Dispose,但本质还是在foreach的时候执行了delete操作,改变了被遍历的集合

剩下的那一半按钮的 c.name 的值假如是2,4,6,8……..那么,就是说明楼上的说法是正确的,这种情况适合用出栈或出队的方法删除

5

从后往前删…

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 动态删除按钮的时候只删除一半,求指导
喜欢 (0)
[1034331897@qq.com]
分享 (0)