Malcolm
Malcolm

Reputation: 12864

Reduce horizontal space in FlowLayoutPanel

See image I want to decrease the space horizontally between each row of controls.

This Windows forms FlowLayoutPanel. I've have highlighted one cell in red to show spacing currently.

enter image description here

Upvotes: 1

Views: 178

Answers (1)

Gareth
Gareth

Reputation: 2791

You can quite easily create you own custom FlowLayoutPanel by deriving from panel.

Although the code below is setting a uniform border for both horizontal and vertical you could quite easily modify to have a property each for horizonatal and vertical spacing.

public class FlowPanel : Panel
{
    protected int _TileBorder;
    public int TileBorder
    {
        get
        {
            return this._TileBorder;
        }
        set
        {
            this._TileBorder = value;
            this.RearrangeControls(this, this.TileBorder);
        }
    }
    public FlowPanel()
    {
        this.AutoScroll = true;
    }
    public FlowPanel(int tileBorder)
    {
        this.AutoScroll = true;
        this.TileBorder = tileBorder;
    }
    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        this.RearrangeControls(this, this.TileBorder);
    }
    protected override void OnControlAdded(ControlEventArgs e)
    {
        base.OnControlAdded(e);
        this.RearrangeControls(this, this.TileBorder);
        e.Control.SizeChanged += new EventHandler(this.Control_SizeChanged);
    }
    protected override void OnControlRemoved(ControlEventArgs e)
    {
        base.OnControlRemoved(e);
        this.RearrangeControls(this, this.TileBorder);
        e.Control.SizeChanged -= new EventHandler(this.Control_SizeChanged);
    }
    protected void RearrangeControls(Panel p, int border)
    {
        int num = border;
        int num2 = border;
        int num3 = 0;
        bool flag = true;
        foreach (Control control in p.Controls)
        {
            if (control != null)
            {
                num3 = ((control.Height > num3) ? control.Height : num3);
                if (flag)
                {
                    num += control.Width + border;
                    control.Location = new Point(border, border);
                    flag = false;
                }
                else
                {
                    if (num + control.Width + 2 * border > p.Width)
                    {
                        num2 += num3 + border;
                        control.Location = new Point(border, num2);
                        num = border + (control.Width + border);
                        num3 = control.Height;
                    }
                    else
                    {
                        control.Location = new Point(num, num2);
                        num += control.Width + border;
                    }
                }
            }
        }
    }
    private void Control_SizeChanged(object sender, EventArgs e)
    {
        this.RearrangeControls(this, this.TileBorder);
    }
}

Now that I look at it, the RearrangeControls method does look slightly hacked-together-in-a-hurry to me now, but I'm sure you could make it nicer!

Upvotes: 1

Related Questions