Добавление элементов Windows Form программно

167
19 декабря 2019, 22:20

В принципе простые элементы добавления мне известны. Типа:

private void Form1_Load(object sender, EventArgs e)
{
    TextBox myText = new TextBox();
    myText.Location = new Point(25, 25);
    this.Controls.Add(myText);
}

Но как быть с автоматическим добавлением элементов. Вот у меня есть такой код: Где я вручную добавил 18 элементов (Picture Box, и Label) поскольку это соответствует количеству спарсенных элементов списка.

И в цикле уже присваивал им значения.

public void MainCol()
{
    #region Boxes
    PictureBox[] boxes = {
    pictureBox1, pictureBox2, pictureBox3, pictureBox4, pictureBox5, pictureBox6, pictureBox7, pictureBox8,
                pictureBox9, pictureBox10, pictureBox11, pictureBox12, pictureBox13, pictureBox14, pictureBox15, pictureBox16, pictureBox17, pictureBox18};
    Label[] labels = {
    label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, label11, label12, label13, label14, label15,
            label16, label17, label18};
    Label[] qal = {
                qual1, qual2, qual3, qual4, qual5, qual6, qual7, qual8, qual9, qual10, qual11, qual12, qual13, qual14, qual15, qual16, qual17, qual18};
    #endregion
    var parsing = namefilm.ProductlistItem();
    int i = 0;
    foreach (var pars in parsing)
    {
        labels[i].Text = parsing[i].NameFilm;
        boxes[i].SizeMode = PictureBoxSizeMode.StretchImage;
        boxes[i].LoadAsync(parsing[i].ImageURl);
        qal[i].Text = parsing[0].Quality;
        LogTex2.Text += parsing[i].NameFilm + "\r\n";
        LogTex2.Text += parsing[i].ImageURl + "\r\n";
        LogTex2.Text += parsing[i].Quality + "\r\n";
        i++;
    }
}

Выглядит это все дело вот так.

Но как сделать так, чтоб в созданный мной FlowLayoutPanel, добавлялась Panel а в эту панель уже добавлялся PictureBox, и Label в соответствии количества списка. А то сотню таких элементов добавлять будет уже не интересно. Благодарю за помощь.

Answer 1

Вы можее контролы добавлять динамически, вам не обяхательно создавать ваши картинки заранее. Вот пример

public class MyForm: Form
{
    FlowLayoutPanel _fpanel;
    public MyForm()
    {
        _fpanel = new FlowLayoutPanel();
        _fpanel.Dock = DockStyle.Fill;
        this.Controls.Add(_fpanel);     
        this.Load+=OnLoad;
    }

    private void OnLoad(object sender, EventArgs e)
    {
        _fpanel.Controls.Clear();
        for(var i=0; i<10; i++)
        {           
            var pb = new PictureBox();
            pb.SizeMode = PictureBoxSizeMode.StretchImage;
            pb.LoadAsync("url");
            _fpanel.Controls.Add(pb);           
        }
    }
}

Как видите, я тут просто прохожу циклом и добавляю в панель всё, что хочу. У меня картинки не загрузятся, потому мое окно будет выглядеть вот так

Answer 2

Собственно вот такой получился код:

        public partial class Form1 : Form
    {
        ParserHTML parserHTML = new ParserHTML();
        NameFilm namefilm = new NameFilm();
        public Form1()
        {
            InitializeComponent();
            ParserHTML parserHTML = new ParserHTML();
            LogText.Text = parserHTML.LoadPage();
            this.Controls.Add(flowLayoutPanel1);
            this.Load += OnLoad;
        }
        private void OnLoad(object sender, EventArgs e)
        {
            var parsing = namefilm.ProductlistItem();
            int i = 0;
            foreach (var pars in parsing)
                {
                var pn = new Panel();
                pn.Size = new Size(140, 180);
                flowLayoutPanel1.Controls.Add(pn);
                ;
                var pb = new PictureBox();
                pb.SizeMode = PictureBoxSizeMode.StretchImage;
                pb.Size = new Size(140, 140);
                pb.LoadAsync(parsing[i].ImageURl);
                pn.Controls.Add(pb);
                var lb = new Label();
                lb.Text = parsing[i].NameFilm;
                lb.Dock = DockStyle.Bottom;
                pn.Controls.Add(lb);
                i++;
                }
            }
    }

Не идеальный, но для теста подойдет, результат:

READ ALSO
C# WPF Убрать из RichTextBox перевод строки

C# WPF Убрать из RichTextBox перевод строки

Как убрать из RichTextBox отступ в конце строки?

156
Как парсить данные в несколько потоков?

Как парсить данные в несколько потоков?

Есть chromedriverЯ хочу запустить его в 3 потока и слать данные этим инстансам из списка

133
Проверить пронумерован ли список С# Word

Проверить пронумерован ли список С# Word

Мне нужно получается подать Word файлИ в параграфе "Библиографический список" (а там их будет много) проверить следующее:

177
Подскажите по логике работы триггера

Подскажите по логике работы триггера

Вопрос теоретический, сделал я триггер, который следит за изменением в таблице, и изменения эти записывает в результирующую таблицуСледит...

145