C# 容器上控件排序

public static class Sort
    {

        #region 设置PanelControl上按钮显示位置
        /// <summary>
        /// 设置按钮显示位置
        /// </summary>
        /// <param name="targetPanel">需要调整按钮顺序的Panel</param>
        /// <param name="buttonSpace">按钮间隔</param>
        public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)
        {
            int length = 0;
            int maxHeight = 0;
            List<Control> listBtn = new List<Control>();
            System.Windows.Forms.Control.ControlCollection c = targetPanel.Controls;
            foreach (Control btn in c)
            {
                listBtn.Add(btn);
                length += btn.Width + buttonSpace;
                if (maxHeight < btn.Height)//获取最大高度
                {
                    maxHeight = btn.Height;
                }
            }
            int pnlLength = targetPanel.Width;
            if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
            {
                return;
            }
            int startPos = ((pnlLength - length) / 2);
            int yPos = 0;
            if (maxHeight < targetPanel.Height)
            {
                yPos = (targetPanel.Height - maxHeight) / 2;//距离panel上边框的距离
            }
            else
            {
                yPos = targetPanel.Height / 10;//距离panel上边框的距离
            }
            int xPos = startPos;
            listBtn.Sort(new ButtonSort());
            foreach (Control btn in listBtn)
            {
                btn.Location = new System.Drawing.Point(xPos, yPos);
                xPos += btn.Width + buttonSpace;
            }
        }
        #endregion 

        #region 设置Control上按钮显示位置
        /// <summary>
        /// 设置按钮显示位置
        /// </summary>
        /// <param name="container">需要调整按钮顺序的容器控件</param>
        /// <param name="buttonSpace">按钮间隔</param>
        public static void SetButtonCenter(Control container, int buttonSpace)
        {
            int length = 0;
            int maxHeight = 0;
            List<Control> listControl = new List<Control>();
            System.Windows.Forms.Control.ControlCollection c = container.Controls;
            foreach (Control btn in c)
            {
                listControl.Add(btn);
                length += btn.Width + buttonSpace;
                if (maxHeight < btn.Height)//获取最大高度
                {
                    maxHeight = btn.Height;
                }
            }
            int pnlLength = container.Width;
            if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
            {
                return;
            }
            int startPos = ((pnlLength - length) / 2);
            int yPos = 0;
            if (maxHeight < container.Height)
            {
                yPos = (container.Height - maxHeight) / 2;//距离panel上边框的距离
            }
            else
            {
                yPos = container.Height / 10;//距离panel上边框的距离
            }
            int xPos = startPos;
            listControl.Sort(new ButtonSort());
            foreach (Control btn in listControl)
            {
                btn.Location = new System.Drawing.Point(xPos, yPos);
                xPos += btn.Width + buttonSpace;
            }
        }
        #endregion 

    }
 public class ButtonSort : IComparer<Control>
    {
        #region IComparer<Button> Members
        //IComparer<T> 接口:定义类型为比较两个对象而实现的方法。
        public int Compare(Control x, Control y)
        {
            if (x.TabIndex >= y.TabIndex)
            {
                return 1;
            }
            else
            {
                return -1;
            }
        }
        #endregion
    }

Sort类完善版本(修正传入控件集合大小不一致,排序后文本显示问题)

 public static class Sort
    {

        #region 设置PanelControl上按钮显示位置
        /// <summary>
        /// 设置按钮显示位置
        /// </summary>
        /// <param name="targetPanel">需要调整按钮顺序的Panel</param>
        /// <param name="buttonSpace">按钮间隔</param>
        public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)
        {
            int length = 0;
            int maxHeight = 0;
            bool controlsHeightSame = true;//控件高度是否一致
            List<Control> lisControl = new List<Control>();
            System.Windows.Forms.Control.ControlCollection controls = targetPanel.Controls;
            foreach (Control btn in controls)
            {
                lisControl.Add(btn);
                length += btn.Width + buttonSpace;
                if (maxHeight < btn.Height)//获取最大高度
                {
                    maxHeight = btn.Height;
                }
            }
            //判断控件高度是否一致
            //lisControl.ForEach(delegate(Control control)
            //{
            //    if (control.Height != maxHeight)
            //    {
            //        controlsHeightSame = false;
            //    }
            //});
            lisControl.ForEach(control =>
            {
                if (control.Height != maxHeight)
                {
                    controlsHeightSame = false;
                }
            });
            int pnlLength = targetPanel.Width;
            if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
            {
                return;
            }
            int startPos = ((pnlLength - length) / 2);
            int yPos = 0;
            int xPos = startPos;
            lisControl.Sort(new ButtonSort());
            //控件绘制的起点是左上角的顶点,yPos即控件的左上角顶点的y坐标
            if (controlsHeightSame)//控件高度一致
            {
                if (maxHeight < targetPanel.Height)
                {
                    yPos = (targetPanel.Height - maxHeight) / 2;//距离panel上边框的距离
                }
                else
                {
                    yPos = targetPanel.Height / 10;//距离panel上边框的距离
                }
                foreach (Control btn in lisControl)
                {
                    btn.Location = new System.Drawing.Point(xPos, yPos);
                    xPos += btn.Width + buttonSpace;
                }
            }
            else//控件大小不一致,每个控件的yPos单独计算
            {
                foreach (Control btn in lisControl)
                {
                    yPos = (targetPanel.Height - btn.Height) / 2;//距离panel上边框的距离
                    btn.Location = new System.Drawing.Point(xPos, yPos);
                    xPos += btn.Width + buttonSpace;
                }
            }

        }
        #endregion

        #region 设置Control上按钮显示位置
        /// <summary>
        /// 设置按钮显示位置
        /// </summary>
        /// <param name="container">需要调整按钮顺序的容器控件</param>
        /// <param name="buttonSpace">按钮间隔</param>
        public static void SetButtonCenter(Control container, int buttonSpace)
        {
            int length = 0;
            int maxHeight = 0;
            bool controlsHeightSame = true;//控件高度是否一致
            List<Control> listControl = new List<Control>();
            System.Windows.Forms.Control.ControlCollection c = container.Controls;
            foreach (Control btn in c)
            {
                listControl.Add(btn);
                length += btn.Width + buttonSpace;
                if (maxHeight < btn.Height)//获取最大高度
                {
                    maxHeight = btn.Height;
                }
            }
            //判断控件高度是否一致
            //listControl.ForEach(delegate(Control control)
            //{
            //    if (control.Height != maxHeight)
            //    {
            //        controlsHeightSame = false;
            //    }
            //});
            listControl.ForEach(control =>
            {
                if (control.Height != maxHeight)
                {
                    controlsHeightSame = false;
                }
            });
            int pnlLength = container.Width;
            if (length > pnlLength) //本身按钮的长度总和大于了panel的长度,不调整
            {
                return;
            }
            int startPos = ((pnlLength - length) / 2);
            int yPos = 0;
            int xPos = startPos;
            listControl.Sort(new ButtonSort());
            //控件绘制的起点是左上角的顶点,yPos即控件的左上角顶点的y坐标
            if (controlsHeightSame)//控件高度一致
            {
                if (maxHeight < container.Height)
                {
                    yPos = (container.Height - maxHeight) / 2;//距离panel上边框的距离
                }
                else
                {
                    yPos = container.Height / 10;//距离panel上边框的距离
                }
                foreach (Control btn in listControl)
                {
                    btn.Location = new System.Drawing.Point(xPos, yPos);
                    xPos += btn.Width + buttonSpace;
                }
            }
            else//控件大小不一致,每个控件的yPos单独计算
            {
                foreach (Control btn in listControl)
                {
                    yPos = (container.Height - btn.Height) / 2;//距离panel上边框的距离
                    btn.Location = new System.Drawing.Point(xPos, yPos);
                    xPos += btn.Width + buttonSpace;
                }
            }

        }
        #endregion

    }
时间: 2024-08-20 06:17:22

C# 容器上控件排序的相关文章

activex-ActiveX如何添加对话框上控件的响应事件

问题描述 ActiveX如何添加对话框上控件的响应事件 使用MFC创建一个ActiveX控件AAA,然后添加一个Dialog资源,双击添加Dialog类CNewDlg,在AAACtrl.cpp的OnDraw函数中调用CNewDlg的DoModal()函数,此时activeX控件会展示一个对话框. 如果在对话框中添加一个按钮,在单击时,控件的容器可以接收到此事件通知,请问应该怎么做?也就是说怎么把dialog的操作,通过事件传递给容器,即把dialog的操作与AAACtrl的事件关联起来? 解决方

ix able-FixTable 固定表头之后,如果通过JS获取页面上控件的值??

问题描述 FixTable 固定表头之后,如果通过JS获取页面上控件的值?? $(function() { FixTable("MyTable",2, $(document.body).width()+10, $(document.body).height() - 50); }); 解决方案 不用jquery选中你的对象就行了,如果FixTable更改过DOM对象结构,需要用开发工具看下修改后的结构,调整你的选择器

winform程序对界面上控件的统一控制【二】组件版

继上篇文章winform 程序对界面上控件的统一控制[一](赋值\清空\验证- -) ,本篇文章将实现一个同样功能的Component(组件). 先看看组件的实现,如下所示: 代码一 public partial class CtrlValidation : Component { public CtrlValidation() { InitializeComponent(); typeCache = new TypeCache(); } public CtrlValidation(IConta

bluetooth-asp.net页面有一个div,点击按钮弹出div,需要根据不同条件给div上控件赋值

问题描述 asp.net页面有一个div,点击按钮弹出div,需要根据不同条件给div上控件赋值 前台代码: function showDiv(type) { switch (type) { case 0://新建 $("#btnDelete").hide(); var myDate = new Date(); $("#tbEndTime").val(myDate.getFullYear() + '-' + myDate.getMonth() + '-' + myD

.Net遍历窗体上控件的方法_实用技巧

本文实例讲述了.Net遍历窗体上控件的方法.分享给大家供大家参考.具体分析如下: 本例实现遍历窗体上的控件以及找出TextBox控件,代码如下: 复制代码 代码如下: foreach( Control control in this.Controls ) {    if( control  is  TextBox )    //判断是否是TextBox控件    {        //TODO...         TextBox textBox=control;     //里氏转换     

winform程序对界面上控件的统一控制【一】(赋值\清空\验证……)

首先来说说本文所描述的东西有哪些功能: (1)在界面上输入某个值之前,其他的控件都处于不可用状态. (2)需检验必填项是否为空. (3)需检验用户输入的格式是否正确. (4)清除控件内容. (5)为控件设置默认值. (6)清除清除错误提示信息(ErrorText). (7)将数据行的值映射到文本编辑框中. (8)将编辑框中的数据赋给数据行. 看看我是怎么实现的 [1]定义"设置条件"的实体类 代码一 /// <summary> /// 设置条件 /// </summa

.NET2005 note(5) web site 上控件的任意拖放

 // // // 在.NET2005的网页设计器中,初始状态并不像2003那样可以任意的拖放,着实让人有点怀疑这个版本是不是在这点上居然有所倒退啊!其实不然,我们可以手动设置,使控件能任意摆放,具体操作如下: Tools--Options--HTML Designer--CSS Positioning-- 将"Change   positioning   to   the   following   for   controls   added   using   the   Toolbox,

ASP.NET:DataGrid控件的排序功能

asp.net|datagrid|datagrid控件|排序 上一节我们已经知道DataGrid排序功能是由AllowSorting属性控制的,这一小节里,我们将通过实例来验证这个功能.     在DataCon Web项目里,添加一个窗体,命名为DataGrid_Sample4.aspx,添加一个DataGrid控件,DataGrid_Sample4.aspx的主要HTML代码如下:<body MS_POSITIONING="GridLayout"><form id

ActiveX控件和它的容器

1.COM基础 2.ActiveX控件及实现 3.ActiveX控件容器及实现 4.总结 1.COM基础 COM是一种组件开发技术, 它实际上是一种在二进制层上兼容的软件开发方法的规范. COM技术是与具体的编程语言无关的技术, 只要是支持COM开发的开发工具都可以用来进行COM应用开发, 而它们在二进制上兼容的要求由各个开发工具来实现, 绝大部分是由编译器实现的. COM的基础概念有以下几部分组成,1)接口的定义及实现, 2)IUnknown接口, 3)GUID (COM中所涉及的概念还有很多