Panel最大嵌套数

博客探讨了.NET中Panel控件的嵌套限制问题。内容指出Panel可以无限嵌套,但存在一个上限,超过该上限会导致界面响应异常,甚至可能导致程序崩溃。作者通过测试发现,不同操作系统上的Panel嵌套上限有所不同,例如在Win7和Win10上分别为15到29层。当嵌套数量达到50层时,会出现创建窗口句柄错误。因此,建议在使用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等容器进行封装,外面调用时再放到若干层的容器中,最终就有可能报错。

转载请注明出处。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值