Добавить метку под кнопкой в ​​flowLayoutPanel

Мне нужно динамически создавать кнопки с метками под ними в flowLayoutPanel, когда я помещаю файл в форму. Но как мне установить положение метки под кнопкой, так как FLP сам организует элементы управления..?

Что я пробовал:

 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);
            }
    }

person alex Alex    schedule 01.04.2014    source источник


Ответы (1)


Лучшая известная мне идея — реализовать настраиваемый элемент управления, содержащий и кнопку, и метку, которые расположены правильно. Затем добавьте пользовательский элемент управления в 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);
    }
}

Затем вы можете добавить к нему следующее:

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

РЕДАКТИРОВАТЬ: Если вы хотите прослушивать события кнопок, попробуйте следующее:

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);
}
person mike1952    schedule 01.04.2014
comment
Теперь элемент управления добавлен хорошо, но событие щелчка не срабатывает... до того, как я использовал button.tag, и в событии щелчка я добавлял тег в строку String path_app = ((sender as CustomControl).Tag как строка); Я использовал button.Click += new EventHandler(button_Click); чтобы определить событие.. В чем может быть проблема? - person alex Alex; 01.04.2014
comment
Отправителем будет кнопка, а не CustomControl. Либо попросите CustomControl прослушать щелчок, а затем передать его с соответствующим тегом через свое собственное событие, либо передать щелчок кнопке (отправитель как кнопка) и использовать ее. - person mike1952; 01.04.2014
comment
Даже с отправителем в качестве кнопки то же самое. Что у меня есть: кнопка CustomControl = новый CustomControl (новая кнопка {тег = path_app, BackgroundImage = bmp}, новая метка {текст = имя_файла}); fl_panel.Controls.Добавить(кнопка); button.Click += новый обработчик событий (button_Click); и в событии нажмите: String path_app = ((sender as Button).Tag as String); - person alex Alex; 01.04.2014
comment
Я отредактировал код в своем ответе, чтобы дать вам более наглядный пример. - person mike1952; 01.04.2014
comment
Спасибо! Я понял :) - person alex Alex; 01.04.2014