Panel最大嵌套数

Panel中可以不断的套Panel,但是Panel的嵌套会有一个上限,当达到这个上限后,界面就不听使唤了。但这时程序并不会崩溃,Panel的嵌套数继续增加,会达到一个崩溃的上限值。

测试代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PanelNest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


            Panel last = null;
            for (int i = 0; i < <strong><span style="color:#3366ff;">29</span></strong>; i++)
            {
                Panel panel = new Panel();
                panel.Dock = DockStyle.Fill;
                if (last==null)
                {
                    this.Controls.Add(panel);
                }
                else
                {
                    last.Controls.Add(panel);
                }
                last = panel;
            }
            last.BackColor = Color.Blue;
        }
    }
}
从代码中可以看到,每一个panel都是fill的,实际上却没有如我们所期望的。为了能更好的分辨,我们将最后一个Panel的背景色设置为blue。看一下效果图。


最大化后的图


当我们把Panel的上限数设置为30,新代码如下

  Panel last = null;
            for (int i = 0; i < <span style="color:#3366ff;"><strong>30</strong></span>; i++)
            {
                Panel panel = new Panel();
                panel.Dock = DockStyle.Fill;
                if (last==null)
                {
                    this.Controls.Add(panel);
                }
                else
                {
                    last.Controls.Add(panel);
                }
                last = panel;
            }
            last.BackColor = Color.Blue;
最大化后的图如下


会发现,最大化后,蓝色底的Panel并没有最大化,但我们预期是要最大化的。这就说明Panel的嵌套是有一个上限值的。经过测试发现,不同的系统会有所差异,在win7上有的为15,有的为29,win10上为29。

当我们继续增加panel的嵌套数量,程度将会崩溃。代码如下。

    Panel last = null;
                for (int i = 0; i <<span style="color:#3366ff;"><strong> 50</strong></span>; i++)
                {
                    Panel panel = new Panel();
                    panel.Dock = DockStyle.Fill;
                    if (last == null)
                    {
                        this.Controls.Add(panel);
                    }
                    else
                    {
                        last.Controls.Add(panel);
                    }
                    last = panel;
                }
                last.BackColor = Color.Blue;
异常图如下

当Panel的数量达到50个时,程序出错了。提示创建窗口句柄时出错。

所以在使用Panel进行嵌套的时候,务必要注意嵌套的层数,尤其是当使用封装的自定义用户控件时,由于自定义用户控件里面已经使用Panel等容器进行封装,外面调用时再放到若干层的容器中,最终就有可能报错。

转载请注明出处。




posted @ 2015-11-03 17:42  _学而时习之  阅读(331)  评论(0)    收藏  举报