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 }
以上就是C# 容器上控件排序的内容,更多相关内容请关注PHP中文网(www.php.cn)!

C#和.NET提供了强大的功能和高效的开发环境。1)C#是一种现代、面向对象的编程语言,结合了C 的强大和Java的简洁性。2).NET框架是一个用于构建和运行应用程序的平台,支持多种编程语言。3)C#中的类和对象是面向对象编程的核心,类定义数据和行为,对象是类的实例。4).NET的垃圾回收机制自动管理内存,简化开发者的工作。5)C#和.NET提供了强大的文件操作功能,支持同步和异步编程。6)常见错误可以通过调试器、日志记录和异常处理来解决。7)性能优化和最佳实践包括使用StringBuild

.NETFramework是一个跨语言、跨平台的开发平台,提供一致的编程模型和强大的运行时环境。1)它由CLR和FCL组成,CLR管理内存和线程,FCL提供预构建功能。2)使用示例包括读取文件和LINQ查询。3)常见错误涉及未处理异常和内存泄漏,需使用调试工具解决。4)性能优化可通过异步编程和缓存实现,保持代码可读性和可维护性是关键。

C#.NET保持持久吸引力的原因包括其出色的性能、丰富的生态系统、强大的社区支持和跨平台开发能力。1)性能表现优异,适用于企业级应用和游戏开发;2).NET框架提供了广泛的类库和工具,支持多种开发领域;3)拥有活跃的开发者社区和丰富的学习资源;4).NETCore实现了跨平台开发,扩展了应用场景。

C#.NET中的设计模式包括Singleton模式和依赖注入。1.Singleton模式确保类只有一个实例,适用于需要全局访问点的场景,但需注意线程安全和滥用问题。2.依赖注入通过注入依赖提高代码灵活性和可测试性,常用于构造函数注入,但需避免过度使用导致复杂度增加。

C#.NET在现代世界中广泛应用于游戏开发、金融服务、物联网和云计算等领域。1)在游戏开发中,通过Unity引擎使用C#进行编程。2)金融服务领域,C#.NET用于开发高性能的交易系统和数据分析工具。3)物联网和云计算方面,C#.NET通过Azure服务提供支持,开发设备控制逻辑和数据处理。

C#.NET开发者社区提供了丰富的资源和支持,包括:1.微软的官方文档,2.社区论坛如StackOverflow和Reddit,3.GitHub上的开源项目,这些资源帮助开发者从基础学习到高级应用,提升编程技能。

C#.NET的优势包括:1)语言特性,如异步编程简化了开发;2)性能与可靠性,通过JIT编译和垃圾回收机制提升效率;3)跨平台支持,.NETCore扩展了应用场景;4)实际应用广泛,从Web到桌面和游戏开发都有出色表现。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版
中文版,非常好用

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

Atom编辑器mac版下载
最流行的的开源编辑器