C# 安排FlowLayoutPanel控件以占用最少的空间

C# 安排FlowLayoutPanel控件以占用最少的空间,c#,.net,flowlayoutpanel,C#,.net,Flowlayoutpanel,我使用FlowLayoutPanel控件,我想知道是否有任何方法来执行控件的自动布局,以便它们占用尽可能少的空间? 例如,添加一个宽度为100px的控件,三个宽度为500px的控件,再添加一个宽度为100px的控件 应该是这样的: ##Control1## ##############Control2########################## ##############Control3########################## ##############Control4#

我使用FlowLayoutPanel控件,我想知道是否有任何方法来执行控件的自动布局,以便它们占用尽可能少的空间? 例如,添加一个宽度为100px的控件,三个宽度为500px的控件,再添加一个宽度为100px的控件

应该是这样的:

##Control1##
##############Control2##########################
##############Control3##########################
##############Control4##########################
##Control5##
正如你所看到的,一些空间被浪费了,是否有任何方法来优化它的位置,以实现这样的东西,而无需手动重新定位

##Control1## ##Control5##
##############Control2##########################
##############Control3##########################
##############Control4##########################
如何安排控件以占用最少的空间: (顶部:初始布局,底部:结果布局)

初始布局:

新布局:


注意:它们是按发现顺序排序的,即如果您希望将编号3放在编号4之后,则在重新组织面板之前,您必须手动将其放在编号4之后。

遗憾的是,这并不能解决我的问题。面板内项目的
FlowBreak
属性是否设置为False?是,所有控件都具有流中断特性。嗯,我需要一些与您显示的相反的东西,我需要从“新布局”转到“初始布局”,以尽可能减少浪费的空间。rry!:D检查我的编辑是否有其他方法,应该很容易理解我是如何做的。我还测试了添加一些控件(和奇数个控件),它没有爆炸,所以我想它没问题;)很好,这似乎正是我所需要的:)我将研究您的代码,将其实现到我的项目中。谢谢
public partial class Form1 : Form
{
    public Form1() {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e) {
        var flowLayoutPanel = flowLayoutPanel1;
        ReorganizeFlowLayoutPanel(flowLayoutPanel);
    }

    private static void ReorganizeFlowLayoutPanel(FlowLayoutPanel flowLayoutPanel) {
        var width = flowLayoutPanel.Width;
        var controls = flowLayoutPanel.Controls.OfType<Control>().ToList();
        var ascending = new List<Control>(controls.OrderBy(s => s.Width));
        var descending = new List<Control>(controls.OrderByDescending(s => s.Width));

        var list = new List<Control>();
        while (ascending.Count > 0) {
            Control smallest = ascending[0];
            ascending.RemoveAt(0);
            if (ascending.Count == 0) {
                list.Add(smallest);
                break;
            }
            foreach (var largest in descending) {
                if (smallest.Width + largest.Width < width) {
                    list.Add(smallest);
                    list.Add(largest);
                    ascending.Remove(largest);
                    descending.Remove(largest);
                    descending.Remove(smallest);
                    break;
                }
            }
        }
        var i = 0;
        foreach (var control in list) {
            flowLayoutPanel.Controls.SetChildIndex(control, i++);
        }
    }
}
using System;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1() {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e) {
            var flowLayoutPanel = flowLayoutPanel1;
            ReorganizeFlowLayoutPanel(flowLayoutPanel);
        }

        private static void ReorganizeFlowLayoutPanel(FlowLayoutPanel flowLayoutPanel) {
            var controls = flowLayoutPanel.Controls.OfType<Control>().OrderBy(s => s.Width);
            var index = 0;
            foreach (var tuple in controls) {
                flowLayoutPanel.Controls.SetChildIndex(tuple, index++);
            }
        }
    }
}