Member 11751386 Ответов: 1

Загружайте файлы изображений и создавайте элементы управления динамически.#


Я создаю приложение windows form, которое позволяет пользователям загружать файлы изображений с url-адреса и устанавливать изображения в picturebox, создавая PictureBox, две кнопки и текстовое поле динамически для каждого изображения.

Что я уже пробовал:

Ниже приведен мой код для загрузки файла изображения с помощью цикла в методе form_load

noofimages = no of images

imagesnames = array containing images names

uploadnumber= folder name created with images

for (int i = 0; i < Globals.noofimages; i++)
{
    client = new WebClient();
    string url = "http://www.upload2printer.co.il/public/uploads/" + Globals.uploadnumber + "/" + Globals.imagesnames[i] + "";
    Uri uri = new Uri(url);
    byte[] bytes;
    bytes = client.DownloadData(uri);
    MemoryStream ms = new MemoryStream(bytes);
    Globals.images[i] = System.Drawing.Image.FromStream(ms);
    create_controls(i);
}


Now create_controls(i) is a method responsible for creating the controls

private void create_controls(int index)
{
    PictureBox pb = new PictureBox();
    pb.Image = Globals.images[index];
    pb.Size = new Size(200, 120);
    Button b1 = new Button();
    Button b2 = new Button();
    TextBox noofprints = new TextBox();
    b1.Size = new Size(20, 20);
    b1.Name = index.ToString();
    b1.Text = "+";
    b1.Location = new Point(x, y + 125);
    b1.Click += new EventHandler(button_Click);
    b2.Size = new Size(20, 20);
    b2.Text = "-";
    b2.Name = index.ToString();
    b2.Location = new Point(x + 180, y + 125);
    b2.Click += new EventHandler(button_Click);
    noofprints.Name = index.ToString();
    noofprints.Size = new Size(160, 18);
    if (status == 0)
    {
        noofprints.Text = "1";
    }
    else if (status == 1)
    {
        noofprints.Text = Globals.noofcopy[index].ToString();
    }
    noofprints.TextAlign = HorizontalAlignment.Center;
    noofprints.Location = new Point(x + 20, y + 125);
    pb.SizeMode = PictureBoxSizeMode.StretchImage;
    pb.Location = new Point(x, y);
    x += pb.Width + 10;
    maxheight = Math.Max(pb.Height, maxheight);
    if (x > this.panel1.Width - 100)
    {
        x = 20;
        y += maxheight + 30;
    }
    this.panel1.Controls.Add(b1);
    this.panel1.Controls.Add(b2);
    this.panel1.Controls.Add(noofprints);
    this.panel1.Controls.Add(pb);
}

Теперь, когда я запускаю приложение и эта форма открывается, форма отображается только тогда, когда все фотографии загружены и все элементы управления созданы.

Что я хочу сделать, так это загрузить каждую фотографию, а затем создать соответствующие элементы управления во время отображения формы.

Я также изучил многопоточность, асинхронность и ожидание,но ничего не смог понять.

Я новичок и программист - самоучка, поэтому знаю, что мой код не идеален, поэтому мне нужна ваша помощь в решении этого вопроса.

Заранее спасибо.

F-ES Sitecore

Взгляните на этот и этот

1 Ответов

Рейтинг:
5

OriginalGriff

Начните с того, что не делайте ничего интенсивного в событии загрузки формы: настройте материал, да, но не делайте больше, чем нужно.

Проблема в том, что загрузка занимает много времени, и пока она не будет завершена, вы не сможете ее отобразить. Поэтому сделайте две вещи:
1) кэшируйте загруженные изображения, чтобы вы могли отображать их быстрее - вы также можете скачать "новые копии" и проверить их на наличие обновлений довольно легко (я бы сохранил хэш с каждым изображением и сравнил бы хэш D/L с версией кэша, это просто сделать).
2) отображение кэшированных изображений в форме.Показанное событие, а не загрузка - это дает пользователю некоторую немедленную обратную связь о том, что приложение запущено.
3) Делайте загрузки в другом потоке.
Я бы предложил использовать класс BackgroundWorker: Класс BackgroundWorker (System.ComponentModel)[^]- он очень прост в использовании и предоставляет вашему основному потоку события "прогресс" и "завершение". Используйте событие Progress, чтобы сигнализировать о загрузке нового изображения (и обновлении дисплея в обработчике), а событие completed-о том, что все сделано. Ссылка включает в себя базовый пример того, как его использовать.


Member 11751386

Миллион раз спасибо за ваш ответ, он был великолепен.
решить мою проблему.
Спасибо

OriginalGriff

Пожалуйста!