我有 FlowLayoutPanel

AutoScroll = 真

FlowDirection = LeftToRight

WrapContents = 真

添加的控件动态具有 相同的宽度 AutoSize 高度 。所以面板会像 this ,它在项目之间有垂直空间。作为由控件的最大高度管理的行的高度。所以我想删除这些不需要的空格,最终结果会像 this

如果使用 FlowLayoutPanel 无法做到这一点,那么完美地完成它的正确想法是什么?

最佳答案

  • 它是一个矩阵,应该像矩阵一样对待。
  • 我的观点是 PanelFlowLayoutpanel 更合适。
  • 请查看我的建议和输出以实现这种行为。

  • 说明: 此代码需要改进以适应所有可能的情况,但您可以从中学习如何处理此类问题的基本思想。
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
    
        private void Form1_Load(object sender, EventArgs e)
        {
            Example();
        }
    
        // space beetween controls (top and right)
        public int MarginSpace = 8;
        // first element location
        public Point StartPoint = new Point(10, 10);
        private void Example()
        {
            var fixesWidth = 70;
            List<Label> randomLables = new List<Label>();
            Random rand = new Random();
            // generate lables with random heights
            for (int i = 1; i < 10; i++)
            {
                Label lr = new Label();
                var randheight = rand.Next(60, 120);
                lr.Size = new Size(fixesWidth, randheight);
                lr.Text = i.ToString();
                lr.BackColor = Color.Black;
                lr.ForeColor = Color.White;
                randomLables.Add(lr);
            }
    
            // check how many elements in one "column" (possible also to add right+left margin)
            var cols = panel1.Width / fixesWidth;
            // create matrix object to get locations of each label
            MyMatrix m = new MyMatrix(cols, randomLables.Count, 15, 70, StartPoint);
            m.SetMatrix(randomLables);
            int counter = 0;
            // pupulate all lables with the points from MyMatrix object
            foreach (Point p in m.pointsMatrix)
            {
                randomLables[counter].Location = p;
                panel1.Controls.Add(randomLables[counter]);
                counter++;
            }
        }
    }
    class MyMatrix
    {
        private int Rows;
        private int TotalElements;
        private int Cols;
        private int Margin;
        private int ElementWidth;
        private Point StartPoint;
        public MyMatrix(int cols, int totalelements, int margin, int elementwidth, Point startingpoint)
        {
            this.Cols = cols;
            this.TotalElements = totalelements;
            this.Margin = margin;
            this.ElementWidth = elementwidth;
            this.StartPoint = startingpoint;
    
            // calculate number of rows
            Rows = totalelements / cols;
        }
    
        public List<Point> pointsMatrix = new List<Point>();
        int cellCounter = 0;
        public void SetMatrix(List<Label> Labels)
        {
            for (int i = 0; i < Rows; i++)
            {
                for (int j = 0; j < Cols; j++)
                {
    
                    var x = StartPoint.X + j * (Margin + ElementWidth);
                    var y = StartPoint.Y;
                    if (cellCounter >= Cols)
                    {
                        // find the parallel cell in the row above
                        y = pointsMatrix[cellCounter - Cols].Y + Labels[cellCounter - Cols].Height + Margin;
                    }
                    else
                    {
                        // do nothing it is first row
                    }
    
                    Point p = new Point(x, y);
                    pointsMatrix.Add(p);
                    cellCounter += 1;
                }
            }
        }
    }
    

    输出:
    c# - Winforms FlowLayoutPanel 使用自动调整大小控件删除不需要的空间-LMLPHP

    关于c# - Winforms FlowLayoutPanel 使用自动调整大小控件删除不需要的空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48611995/

    10-09 21:08