遇到了个问题,想通过用户自定义是生成扫雷界面,Form2为自定义扫雷行数和列数窗口,窗口中有确定按钮,我在Form2中设置了一个bool isSure变量判断用户是否点击确定按钮,还设置了hang变量获取用户自定义输入的扫雷界面行数,Form1为主窗口,Form1中设置LeiBtn类中的x变量表示界面行数。现在的问题是在自定义窗口中设置完行数和列数后,主窗口雷区的界面不刷新,仍为初始状态。请大神们帮着看看怎么办呀!!
代码如下:
Form2.cs:
private void Button1_Click(object sender, EventArgs e)
        {
            isSure=true;
            Form1 f = new Form1();
            f.Defined();// Defined函数为显示雷区函数
            this.Close();
         }Form1.cs:
     public  void Defined()
        {
           if (Form2.isSure == true)
            {
                MessageBox.Show("条件1");
                LeiBtn.x = Form2.hang;
                LeiBtn.y = Form2.row;
                DisplayMine();
                foreach (Control obj0 in this.Controls)
                {
                    this.Controls.Clear();
                }
            }
            else
            {
                MessageBox.Show("初始状态");
                LeiBtn.x = 10;//雷区初始状态行数为10
                LeiBtn.y = 10;//雷区初始状态列数为10
                DisplayMine();
            }        }        public   void DisplayMine()
        {
            for (int i = 0; i < LeiBtn.x; i++)
            {
                for (int j = 0; j < LeiBtn.y; j++)
                {
                    LeiBtn btn = new LeiBtn();
                    btn.Size = new Size(25, 25);
                    btn.Location = new Point(20 + i * 25, 80 + j * 25);
                    this.Controls.Add(btn);
                }
            }        }
       
        private void Form1_Load(object sender, EventArgs e)
        {
            Defined();
        }

解决方案 »

  1.   

    public   void DisplayMine()
            {
                for (int i = 0; i < LeiBtn.x; i++)
                {
                    for (int j = 0; j < LeiBtn.y; j++)
                    {
                        LeiBtn btn = new LeiBtn();
                        btn.Size = new Size(25, 25);
                        btn.Location = new Point(20 + i * 25, 80 + j * 25);
                        this.Controls.Add(btn);
                    }
                }
    是生成扫雷界面的, LeiBtn.x,LeiBtn.y应该是你定义的行和列,你应该先清除雷区的btn,再DisplayMine(),别外再在者说封装,你要传递函数,不要总用公用变量,他是可以被其他操作改变的
      

  2.   

    我按照你提供的思路进行了重新改进,在Form2.cs中将自定义获取的行数和列数赋值给了LeiBtn.x,LeiBtn.y。然后我使用foreach (Control obj0 in this.Controls)
                    {
                        this.Controls.Clear();
                    }
    遍历每个空间,进行删除,在执行DisplayMine()
    代码如下: if (Form2.isSure == true)
                {
                    MessageBox.Show("进入刷新扫雷界面");
                    LeiBtn.x = Form2.hang;
                    LeiBtn.y = Form2.row;
                    foreach (Control obj0 in this.Controls)
                    {
                        this.Controls.Clear();
                    }
                    DisplayMine();
                }
                else
                {
                    MessageBox.Show("初始状态");
                    LeiBtn.x = 10;
                    LeiBtn.y = 10;
                    DisplayMine();
                }
    但界面不刷新,刚学习编程没多久,小白一个,麻烦你在帮着看一下,谢谢
      

  3.   

    跟踪displaymine
      

  4.   

    按我的理解Form1是主窗口,Form2是设置窗口,在Form1上按设置弹出Form2,Form2修改关闭回到Form1,Form1的界面改变。是要这样的效果对吧。
    但是Form2里的Form1是新建的局部变量,跟作为主窗口的Form1没有任何关系所以是无效的。