解决方案 »

  1.   

    panel1.Controls.Clear(); 只是把 panel1中的控件列表清空, 并没有把原来在其中的控件给销毁。例如,开头有5个对象,panel1, but1,but2,but3,but4,它们都是真真地占用内在的。 panel1.Controls.Add()就把后面4个对象一个个加入panel1的列表中, 等清空时,只是几者脱离关系而已。
      

  2.   


    那应该怎么删除button控件?还有,单击中等后单击简单不是clear了么? 为什么在panel控件中依然显示button
      

  3.   

    列表清空,通常控件就销毁了.因为本身就是动态new出来的控件,而句柄已经在new完之后就释放掉了
    没有任何变量引用这个控件,GC会负责将它们回收不过看楼主的代码,使用了Button[] MyButton数组,那么即使执行了clear,数组依然在引用控件,所以不会销毁.
      

  4.   

    第二个问题,你没有按固定数值循环,而是使用了panel的宽度和高度作为变量来循环
    而panel大小又设置为自适应控件
    所以只能越变越大,不会缩回去
      

  5.   

    要么按固定的行数和列数来循环
    要么循环之前代码修改下panel的大小
      

  6.   


    谢谢!这个问题解决了! 怪不得会没有变化。
    能否再请教一个问题,能否用代码控制winform的宽度以及高度?应该如何写? 百度了一天就是没有找到
      

  7.   

    如何正确的销毁button?另外能否不用数组动态添加button? 我之前参考了一个代码,只new了一个button,但是可以不断在panel里面添加按钮,我自己写的时候又不可以= =
      

  8.   


    static void Main(string[] args)
            {
                Panel childPanel = new Panel();
                childPanel.Size = new Size(100, 100);
                childPanel.BorderStyle = BorderStyle.FixedSingle;
                childPanel.Dock = DockStyle.Fill;            Form win = new Form();
                win.StartPosition = FormStartPosition.CenterScreen;
                win.TopMost = true;
                //如果去掉下面一句,那么宽度就会自动变得宽一些
                win.FormBorderStyle = FormBorderStyle.None;
                Panel Parent = new Panel();
                Parent.Dock = DockStyle.Fill;
                Parent.BackColor = Color.Blue;            Panel other = new Panel();
                other.Dock = DockStyle.Bottom;
                other.BackColor = Color.Gray;
                other.Size = new Size(200, 200);            win.Controls.Add(Parent);
                win.Controls.Add(other);
                Parent.BringToFront();            int WindowsClientWidth = childPanel.Size.Width;
                int WindowsClientHeight = childPanel.Size.Height;
                win.ClientSize = new Size(WindowsClientWidth, WindowsClientHeight + other.Size.Height);            win.Controls[0].Controls.Add(childPanel);
                childPanel.BackColor = Color.Red;            win.Show();
                string message = "childPanel:\t\t宽为{0},高为{1}\r\n" +
                                 "textbox:\t\t\t宽为{6},高为{7}\r\n" +
                                    "客户区:\t\t\t宽为{4},高为{5} \r\n" +
                                    "Windows:\t\t宽为{2},高为{3}\r\n";            MessageBox.Show(win, string.Format(message, childPanel.Size.Width, childPanel.Size.Height,
                    win.Size.Width, win.Size.Height,
                    win.ClientSize.Width, win.ClientSize.Height,
                    other.Size.Width,other.Size.Height));
            }
    给你一段代码,你建一个console程序,引用System.Windows.Forms和System.Drawing
    然后run起来,你就知道了
      

  9.   

    我给的代码是演示修改windows的长和宽的
      

  10.   

    form有size属性啊,设置一下就行了,可以用代码在运行时动态修改
    销毁button的问题,如果每次new一个button,不放进数组,直接放进panel,clear的时候就会销毁
    不过对于你的应用,是很不方便的,你需要用数组来计算点击的按钮相邻的8个按钮里的状态,如果没有数组,你就很难在panel里找到正确的相邻的button
    其实你完全没必要为销毁button烦恼
    虽然clear之后不会立即销毁
    但是你重新new过,重新给数组赋值之后,之前的button就不再有任何引用,GC会赋值销毁,而不会越来越多导致内存溢出的
    这样你内存里最多就只有数组长度个botton而已
    或者你从中级变成初级的时候,前N个赋值为bottn,后面的循环赋值为null,GC有空就会把它销毁了
      

  11.   

    对了
    panel1.Width = 300;
                panel1.Height = 300;
    你这里不就是给panel设置大小了吗
    不过我怎么记得高度和宽度不能直接赋值,必须赋值panel.size才行呢
      

  12.   

    我的意思是要在代码中实现size的改变,但是在控件内无法获取form属性。。不知道怎么解决。。另外非常感谢你的回答!
      

  13.   


    是不是赋值了null并且没有引用的情况下,button就会给销毁?
      

  14.   

    这个跟赋值null其实没有什么关系,就是没有引用,就会被销毁
    比如Botton B=new Botton();
    如果B是局部变量,那么函数执行完,new的这个Botton就没有引用了(当前前提是你没有把他add进panel里)
    如果B是全局变量,那么即使函数执行完,B依然在保持Botton的强引用
    设置B=null,就是将B指向一个空引用,此时就不再有任何变量引用Botton,GC会在适当的时候将它回收掉(当然也不会立即回收)
      

  15.   

    这个跟赋值null其实没有什么关系,就是没有引用,就会被销毁
    比如Botton B=new Botton();
    如果B是局部变量,那么函数执行完,new的这个Botton就没有引用了(当前前提是你没有把他add进panel里)
    如果B是全局变量,那么即使函数执行完,B依然在保持Botton的强引用
    设置B=null,就是将B指向一个空引用,此时就不再有任何变量引用Botton,GC会在适当的时候将它回收掉(当然也不会立即回收)懂了个大概
      

  16.   

    如果不赋值null,而是重新B=new Botton();
    那么之前new出来的Botton就会被销毁,B会保持对后new出来的Botton的强引用
      

  17.   

    panel的宽度没有变化,可能显示出来个数不对。
      

  18.   

    联系你上面的话,看懂了! 非常感谢你的回答!另外我能否问一下winform 高度还有宽度可不可以改变...我的意思是在控件里面,例如我在panel无法指定winform的height。怎么解决?
      

  19.   

    控件的里面,是什么意思?
    你从panel继承了一个自定义控件,然后把代码写在了这个类里?那当然是找不到窗体对象了.
    虽然用parent属性可能能直接在控件的代码里改窗体大小,不过还是建议把代码放到窗体类中去.
      

  20.   

    你在窗体里加段代码,给panel的sizechanged注册个事件,然后修改窗体的size跟panel一样大,不就行了
    不要老想在窗体的外部类里操作窗体的属性啊