Search code examples
c#buttonlabelflowlayoutpanel

Add label under button in a flowLayoutPanel


I need to dynamically create buttons with labels under them in a flowLayoutPanel when i drop a file onto the form. But how do I set the label position to be under the button since the FLP is arranging the controls by itself.. ?

What I've tried:

 void Form1_DragDrop(object sender, DragEventArgs e)
    {
        string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];

        foreach (string s in fileList)
            {
                Button button = new Button();

                button.Click += new EventHandler(this.button_Click);
                fl_panel.Controls.Add(button);

                Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(filename);
                Bitmap bmp = icon.ToBitmap();
                button.BackgroundImage = bmp;
                button.Width = 60;
                button.Height = 75;
                button.FlatStyle = FlatStyle.Flat;
                button.BackgroundImageLayout = ImageLayout.Stretch;            

                int space = 5;
                int Yy = button.Location.Y;
                int Xx = button.Location.X;
            Label label = new Label();
            label.Location = new Point(Yy + space, Xx);
            //label.Margin.Top = button.Margin.Bottom;

            fl_panel.Controls.Add(label);
            }
    }

Solution

  • The best idea I know of is to implement a custom control that contains both a button and a label that are arranged correctly. Then add the custom control to the FlowLayoutPanel.

    public class CustomControl:Control
    {
        private Button _button;
        private Label _label;
        public CustomControl(Button button, Label label)
        {
            _button = button;
            _label = label;
            Height = button.Height + label.Height;
            Width = Math.Max(button.Width, label.Width);
            Controls.Add(_button);
            _button.Location = new Point(0,0);
            Controls.Add(_label);
            _label.Location = new Point(0, button.Height);
        }
    }
    

    You can then add to it like this:

    for (int i = 0; i < 10; i++)
    {
        CustomControl c = new CustomControl(new Button {Text = "Button!"}, new Label {Text = "Label!"});
        fl_panel.Controls.Add(c);
    }
    

    EDIT: If you want to listen to button events, try this:

    for (int i = 0; i < 10; i++)
    {
        var button = new Button {Text = "Button " + i};
        CustomControl c = new CustomControl(button, new Label {Text = "Label!"});
        button.Click += buttonClicked;
        fl_panel.Controls.Add(c);
    }
    ...
    private void buttonClicked(object sender, EventArgs e)
    {
        MessageBox.Show(((Button) sender).Text);
    }