2017-06-30 5 views
0

Ich erstelle eine Windows-Formularanwendung, die es Benutzern ermöglicht, Bilddateien von URL herunterzuladen und die Bilder in Picturebox zu legen, während die Picturebox, zwei Schaltflächen und ein Textfeld dynamisch für jedes Bild erstellt werden.Bilddateien herunterladen und Steuerelemente dynamisch erstellen C#

Unten ist mein Code-Image-Datei zum Herunterladen in form_load Methode

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

Jetzt, als ich die Anwendung ausführen und dieses Formular geöffnet wird, um das Formular angezeigt mit Schleife wird nur dann, wenn alle Fotos und alle Bedienelemente geladen wurden erstellt.

Ich möchte jedes Foto herunterladen und dann die entsprechenden Steuerelemente erstellen, während das Formular angezeigt wird.

Ich schaute auch in Multi-Threading und Async und wartete, war aber nicht in der Lage, etwas herum zu verstehen.

Ich bin ein Anfänger und ein autodidaktischer Programmierer, also weiß ich, dass mein Code nicht perfekt ist, also möchte ich Ihre Hilfe bei der Lösung dieser Angelegenheit.

Vielen Dank im Voraus.

+0

Wahrscheinlich machen Sie dies im Form_Load-Ereignis. Das Formular wird nach Abschluss dieser Veranstaltung angezeigt! Erstellen Sie eine neue Aufgabe im Form_Load-Ereignis und fügen Sie sie nach jedem heruntergeladenen Bild Ihrem Formular hinzu. Noch ein Hinweis: Sie haben die Position der Steuerelemente ändern –

+0

Vielleicht bei https://stackoverflow.com/questions/19163966/add-controls-to-gui-in-background-worker einen Blick darauf werfen. Sie möchten die Benutzeroberfläche reaktionsschnell halten und die Steuerelemente einzeln nacheinander hinzufügen und sie rendern, sobald Sie sie hinzufügen. Ich denke, das ist der richtige Weg! – Digvijay

Antwort

3

Dies ist ein Problem, die mithilfe des Task-Parrallel Library (TPL) Datenfluß-Ansatz sehr gut gelöst werden können.

Aber für den Anfänger könnte es kompliziert aussehen.

hier lesen: https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/dataflow-task-parallel-library

und

https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/walkthrough-using-dataflow-in-a-windows-forms-application

Im Allgemeinen, was würden Sie tun müssen, ist eine separate dataflow blocks zu handhaben spezifische Stück Arbeit zu schaffen. In Ihrem Fall hätten Sie zwei Blöcke - der erste Block könnte dafür verantwortlich sein, das Bild aus dem Internet zu erfassen, der zweite könnte sich mit der Aktualisierung der Benutzeroberfläche befassen, indem er ein Steuerelement für das heruntergeladene Bild erstellt und anzeigt.

Verwandte Themen