C# 容器上控件排序

public static class Sort    {        #region 设置PanelControl上按钮显示位置        ///         /// 设置按钮显示位置        ///         /// 需要调整按钮顺序的Panel        /// 按钮间隔        public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)        {            int length = 0;            int maxHeight = 0;            List listBtn = new List();            System.Windows.Forms.Control.ControlCollection c = targetPanel.Controls;            foreach (Control btn in c)            {                listBtn.Add(btn);                length += btn.Width + buttonSpace;                if (maxHeight  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上按钮显示位置        ///         /// 设置按钮显示位置        ///         /// 需要调整按钮顺序的容器控件        /// 按钮间隔        public static void SetButtonCenter(Control container, int buttonSpace)        {            int length = 0;            int maxHeight = 0;            List listControl = new List();            System.Windows.Forms.Control.ControlCollection c = container.Controls;            foreach (Control btn in c)            {                listControl.Add(btn);                length += btn.Width + buttonSpace;                if (maxHeight  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    {        #region IComparer

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

 public static class Sort    {        #region 设置PanelControl上按钮显示位置        ///         /// 设置按钮显示位置        ///         /// 需要调整按钮顺序的Panel        /// 按钮间隔        public static void SetButtonCenter(ScrollableControl targetPanel, int buttonSpace)        {            int length = 0;            int maxHeight = 0;            bool controlsHeightSame = true;//控件高度是否一致            List lisControl = new List();            System.Windows.Forms.Control.ControlCollection controls = targetPanel.Controls;            foreach (Control btn in controls)            {                lisControl.Add(btn);                length += btn.Width + buttonSpace;                if (maxHeight             {                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上按钮显示位置        ///         /// 设置按钮显示位置        ///         /// 需要调整按钮顺序的容器控件        /// 按钮间隔        public static void SetButtonCenter(Control container, int buttonSpace)        {            int length = 0;            int maxHeight = 0;            bool controlsHeightSame = true;//控件高度是否一致            List listControl = new List();            System.Windows.Forms.Control.ControlCollection c = container.Controls;            foreach (Control btn in c)            {                listControl.Add(btn);                length += btn.Width + buttonSpace;                if (maxHeight             {                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    }

 以上就是C# 容器控件排序的内容,更多相关内容请关注PHP中文网(www.php.cn)!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1432296.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 06:27:03
下一篇 2025年12月17日 06:27:10

相关推荐

  • C# 移除数组中重复数据

    #region 移除数组中重复数据 /// /// 移除数组中重复数据 /// /// 需要除重的数组 /// 不重复数组 public static string[] DelRepeatData(string[] array) { return array.GroupBy(p => p).S…

    好文分享 2025年12月17日
    000
  • C# 字符串中多个连续空格转为一个空格

    #region 字符串中多个连续空格转为一个空格 /// /// 字符串中多个连续空格转为一个空格 /// /// 待处理的字符串 /// 合并空格后的字符串 public static string MergeSpace(string str) { if (str != string.Empty …

    好文分享 2025年12月17日
    000
  • C# 多态性

    转载自:MSDN 类似文章:点击打开链接  Polymorphism(多态性)是一个希腊词,指“多种形态”,多态性具有两个截然不同的方面:  发生此情况时,该对象的声明类型不再与运行时类型相同。  在运行时,客户端代码调用该方法,CLR 查找对象的运行时类型,并调用虚方法的重写方法。 因此,你可以在…

    2025年12月17日
    000
  • C# 自定义 implicit和explicit转换

    explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换explicti 表示显式转换,如从 a -> b 必须进行强制类型转换(b = (b)a)implicit 表示隐式转换,如从 b -> a 只需直接赋值(a = b) 隐式转换可以让我…

    2025年12月17日
    000
  • C# 多线程参数传递

    1、通过实体类来传递(可以传递多个参数与获取返回值),demo如下: 需要在线程中调用的函数: namespace ThreadParameterDemo{ public class FunctionClass { public static string TestFunction(string n…

    2025年12月17日
    000
  • C# 下载带进度条代码(普通进度条)

    /// /// 下载带进度条代码(普通进度条) /// /// 网址 /// 下载后文件名为 /// 报告进度的处理(第一个参数:总大小,第二个参数:当前进度) /// True/False是否下载成功 public static bool DownLoadFile(string URL, stri…

    2025年12月17日 好文分享
    000
  • C# 可以利用反射给只读属性赋值吗?

    结论:可以 验证demo如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;usi…

    2025年12月17日 好文分享
    000
  • C# 接口作用的深入理解

    原文地址:http://www.php.cn/ 假设我们公司有两种程序员:VB程序员,指的是用VB写程序的程序员,用clsVBProgramer这个类表示;Delphi程序员指的是用Delphi写程序的程序员,用clsDelphiProgramer这个类来表示。每个类都有一个WriteCode()方…

    好文分享 2025年12月17日
    000
  • C# 对象比较(值类型、引用类型)

    #region 引用对象比较 /// /// 引用对象比较 /// /// /// /// public static bool CompareObject(object objA, object objB) { bool flag = false; if (objA == null || objB…

    好文分享 2025年12月17日
    000
  • C# datatable中重复数据去重

    #region datatable去重 /// /// datatable去重 /// /// 需要去重的datatable /// 依据哪些列去重 /// public static DataTable GetDistinctTable(DataTable dtSource, params str…

    好文分享 2025年12月17日
    000
  • C# WCF DataContractSerializer 类

         原文地址:点击打开链接       DataContractSerializer 类      使用提供的数据协定,将类型实例序列化和反序列化为 XML 流或文档。 无法继承此类。      命名空间:  System.Runtime.Serialization        程序集:  …

    好文分享 2025年12月17日
    000
  • C# 实体类序列化与反序列化二 (DataContractSerializer)

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.Serialization;using System.IO;using System.Xml;…

    好文分享 2025年12月17日
    000
  • C# 将一个对象转换为指定类型

    原文地址:点击打开链接 适用:普通的对象,并且有默认的无参数构造函数 #region 将一个对象转换为指定类型 /// /// 将一个对象转换为指定类型 /// /// 待转换的对象 /// 目标类型 /// 转换后的对象 public static object ConvertToObject(o…

    好文分享 2025年12月17日
    000
  • C# Json 序列化与反序列化二

    /// /// 将对象转换为 JSON 字符串 /// /// /// /// public static string ScriptSerialize(T input) { string _jsonString = string.Empty; if (input != null) { JavaSc…

    好文分享 2025年12月17日
    000
  • C# 根据KeyEventArgs与组合键字符串相互转换

    /// 快捷键相关的类 /// public static class HotKeyInfo { /// /// 根据KeyEventArgs生成组合键字符串 /// /// /// public static string GetStringByKey(KeyEventArgs e) { if (…

    好文分享 2025年12月17日
    000
  • C# 内存管理

    windows使用一个系统:虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全由windows在后台管理。其实际结果是”位处理器上的每个进程都可以使用4gb的内存ˉ—无论计算机上实际有多少硬盘空间(在64位处理器上,这个数字会更大。这个4gb的内存实际上包含了程序的所…

    2025年12月17日
    000
  • C# DataTable中返回列中的最大值

    此处以表dt2中的keyIndex列(int类型)为例 1、通过linq来实现 int maxKeyIndex = dt2.AsEnumerable().Select(t => t.Field(“keyIndex”)).Max();linq语法:点击打开链接2、通过compute方法来实现 i…

    好文分享 2025年12月17日
    000
  • 使用 Override 和 New 关键字进行版本控制(C# 编程指南)

    原文地址:点击打开链接  这具有多方面的意义。例如,这意味着在基类中引入与派生类中的某个成员具有相同名称的新成员在 C# 中是完全支持的,不会导致意外行为。 它还意味着类必须显式声明某方法是要重写一个继承方法,还是一个隐藏具有类似名称的继承方法的新方法。 在 C# 中,派生类可以包含与基类方法同名的…

    好文分享 2025年12月17日
    000
  • C#基础知识整理 基础知识(19) 值类型的装箱和拆箱(二)

    如果代码中会造成编译器的反复装箱,可改为手动装箱,这样来使代码执行更快,看下面代码: //手动装箱 Int32 v = 5; //由于string.Format的参数是object类型,所以这里会造成三次装箱。 Console.WriteLine(string.Format(“{0},{1},{2}…

    好文分享 2025年12月17日
    000
  • C#基础知识整理 基础知识(20) 委托(一)

    委托和事件在c#中使用很多,尤其在进行窗体编程时,很多的操作都要通过委托和事件来处理和传递。这里详细解释下委托和事件的用法和原因,使我们在写代码时能更加明白一些。委托的使用事件是一种机制,事件是通过委托实现的,所以看明白了委托,对于事件也就能更好的理解了。先看下面一个小例子。这是描述不同语言的程序员…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信