项目实例:车辆信息统计报表管理系统FlowLayoutPanel容器的问题

FlowLayoutPanel

 

一些应用程序需要一个布局可随窗体大小的调整或其中内容大小的改变而自动进行适当排列的窗体。在需要动态布局并且不希望在代码中显式处理Layout事件时,可考虑使用布局面板。

FlowLayoutPanel.NET Framework的新增控件。顾名思义,面板可以采用Web窗体的方式给Windows窗体布局。FlowLayoutPanel是一个容器,允许以垂直或水平的方式放置包含的控件。除了放置控件之外,还可以剪辑控件。放置的方向使用FlowDirection属性和FlowDirection枚举来设置。WrapContents属性确定在重新设置窗体的大小时,控件是放在下一行、下一列,还是剪辑控件。

FlowLayoutPanel按特定的流方向排列其内容:水平或垂直。其内容可从一行换到下一行,或者从一列换到下一列。另一种情况是不换行,而是将其内容截掉。

相信大家在做WinForm项目的时候,要对大量的控件进行排序(位置摆放),这个容器肯定最受欢迎,但很遗憾的是,此容器本身虽支持DockAnchor属性,但不支持放入此容器内的控件的DockAnchor属性(自动调整宽度),也就说,但窗体伸缩,FlowLayoutPanel容器自身可以缩放,但是里面的控件就没那么幸运了,不支持自动缩放,这样就必须写方法来触发新的事件来调整控件的大小,这样就会导致窗体的闪烁(重绘)。

借助ManagedSpy工具,我们可以看到此容器里面的器件的结构,我们可以在Form1里面添加一个事件SizeChanged 对容器里面每个器件重新给它大小就行了。

 

int TOTAL_WIDTH = ((Form)sender).Width - 35;          

foreach (Control control in ((Form)sender).Controls)

       {

                if ((control as FlowLayoutPanel) != null)

                {

                    (control as FlowLayoutPanel).Width = ((Form)sender).Width;

                    foreach (Control fControl in (control as FlowLayoutPanel).Controls)

                    {

                        if (fControl is DataGridView)

                        {

                            fControl.Width = TOTAL_WIDTH;

                        }

                        if (fControl.AccessibleDescription=="X")

                        {

                            //AccessibleDescription这个属性很好用,将报告给具有辅助功能的客户端的说明(可以自定义唯一标识符)。

                            fControl.Width = TOTAL_WIDTH;

                        }

                    }

 

                }

 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FlowLayoutPanel实例Demo

地址一

地址二

地址三

MSDN关于FlowLayoutPanel介绍

原文地址:https://www.cnblogs.com/Gemgin/p/3136336.html