質問

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);
            }
    }
役に立ちましたか?

解決

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);
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top