Auf Laufzeit erstellte PictureBox löschen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von xXlJONASLXx.

    Auf Laufzeit erstellte PictureBox löschen

    Hallo,

    ich erzeuge beim starten einer Form, in einer Laufzeit, in einem Panel PictureBoxen.
    Orientiert habe ich mich da an einem anderen Foren Beitrag vom Rolf-W zum Thema Auf zur Laufzeit erstellte PictureBox zugreifen und das funktioniert auch sehr gut.
    Wenn ich jetzt aber die Kategorie wechseln, baut er die neuen PictureBoxen hinter die alten.
    Da wer meine frage jetzt, wie bekomme ich die alten PictureBoxen vor dem neuen Durchgang gelöscht.

    MFG Jonas

    VB.NET-Quellcode

    1. Sub test()
    2. Durchgang = 0
    3. IC = 0
    4. Page_Max_X = Panel1.Width
    5. MaxBilder = BilderDataGridView.RowCount
    6. Do
    7. If Not Durchgang = MaxBilder Then
    8. IC += 1
    9. Dim nPb = New PictureBox
    10. Me.Invoke(Sub() Panel1.Controls.Add(nPb))
    11. With nPb
    12. .Name = String.Format("Bild Nr. {0}", IC.ToString)
    13. .Location = New Point(Image_Location_X, Image_Location_Y)
    14. .Size = New Size(Image_X, Image_Y)
    15. .SizeMode = PictureBoxSizeMode.Zoom
    16. .BorderStyle = BorderStyle.FixedSingle
    17. .Image = Image.FromFile(Bild)
    18. .Tag = BilderDataGridView.Rows(Durchgang).Cells(0).Value
    19. End With
    20. AddHandler nPb.MouseClick, AddressOf Picture_Box_Click
    21. ''Berechnung der X und Y Werte des neues Bildes
    22. If Image_Location_X + Image_X + Image_X + Images_distance_X + Images_distance_X <= Page_Max_X Then
    23. Image_Location_X = Image_Start_Location_X + Image_Location_X + Image_X + Images_distance_X
    24. Else
    25. Image_Location_X = Image_Start_Location_X
    26. Image_Location_Y = Image_Start_Location_Y + Image_Location_Y + Image_Y + Images_distance_Y
    27. End If
    28. Durchgang += 1
    29. Else
    30. Exit Do
    31. End If
    32. Loop
    33. End Sub

    xXlJONASLXx schrieb:

    Orientiert habe ich mich da an einem anderen Foren Beitrag vom Rolf-W zum Thema Auf zur Laufzeit erstellte PictureBox zugreifen und das funktioniert auch sehr gut.
    Das war evtl. keine gute Idee, sich da zu orientieren, weil dort wird doch genau von dieser Vorgehensweise abgeraten.

    Ich würde - wenn ich viele Bilder gleichzeitig sehen will - sie in einer ListView anzeigen.
    Noch einfacher ist, man wählt einen Bild-Namen im DGV aus, und bekommt das Bild auf einer grossen Picturebox angezeigt. Da sieht man immer ein Bild, das aber optimal gross.
    Zu beidem kann ich die Sources verlinken, falls du interessiert bist.
    Nochmal vielen dank für den Code.
    Ich habe nur ein kleines Problem und zwar wenn ich Bilder in die ImageList packe, sagt das Programm mir beim starten:

    Die Datei "Pages\Category\Main\Category_Picture.resx" konnte nicht verarbeitet werden, weil sie sich im Internet oder in der Zone eingeschränkter Websites befindet oder die Webmarkierung aufweist. Entfernen Sie die Webmarkierung, wenn Sie diese Dateien verarbeiten möchten.

    Dieses Problem habe ich nur in Visual Studio 2019, in 2017 geht alles
    Klick im Dateibrowser mit der rechten Maustaste auf die Datei, klick auf Eigenschaften und dann unten rechts: Zugriff erlauben
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @xXlJONASLXx Beschreib mal detailliert ohne Verwendung von Code, was Du eigentlich erreichen willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Mein Ziel ist es eine Art Gallery zu programmieren, wo je nachdem was man als Kategorie auswählt(z.B. Urlaub, Arbeit oder Freizeit) das Programm die passenden Bilder aus einem Datagridview sucht und in einer überschaubaren Größe auf der Form darstellt.
    Klickt man jetzt eines dieser Bilder an, soll es in einer neuen Form größer angezeigt werden.
    @xXlJONASLXx OHa.
    Mein Vorschlag wäre folgender:
    Kein ListView!.
    Nimm ein FlowLayoutPanel, mach Dir ein UserControl mit ner PictureBox und was Du ggf. noch brauchst.
    Wenn ein neues Bild dazu kommt, erstellst Du dieses UserControl mit dem Bild und fügst es dem FlowLayoutPanel hinzu.
    Wenn es weg soll, sendet die betreffende UserControl-Instanz ein Event an die PArent-Form, wo sie aus dem FlowLayoutPanel rausgenommen wird.
    Die Anzeige handelt dann das FlowLayoutPanel allein.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Kein ListView!
    Warum nicht?
    Wie mein oben verlinkter SourceCode-Austausch-Beitrag zeigt, bietet Listview einige nützliche Features, die man sich dann selbst zu programmieren sparen kann.
    Insbesondere Highlighting und Verwaltung selektierter Item dürfte hier interessant sein.
    Klar hat ein Ansatz mit UserControls auch seine Vorzüge.
    Aber "Kein ListView!" mit Rufzeichen findich nicht ganz angemessen - zumal der Rumpf einer ListView-Lösung ja schon bereitsteht.
    @ErfinderDesRades Glaub ich Dir aufs Wort.
    Aber in meinem Repertoire kommt ListView nicht vor.
    Sorry.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei der Datei handelt es sich um ein normales Bild(1kb groß und endet mit .png) was im Programm auch schon verwendet wird. Wenn ich das Bild jetzt zu ImageList hinzufüge kommt der Fehler. Das ganze habe ich auch in dem Testprogramm probiert, was oben verlinkt wurde und da geht alles einwandfrei.
    @xXlJONASLXx Wie groß ist denn das Bild?
    Die ImageList möchte keine Riesen-Bilder.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    xXlJONASLXx schrieb:

    Bei der Datei handelt es sich um ein normales Bild(1kb groß und endet mit .png) was im Programm auch schon verwendet wird. Wenn ich das Bild jetzt zu ImageList hinzufüge kommt der Fehler. Das ganze habe ich auch in dem Testprogramm probiert, was oben verlinkt wurde und da geht alles einwandfrei.
    höchst erstaunlich!
    Das Problem wird von einer png-Datei verursacht, die Fehlermeldung redet dann aber von einer ganz anderen Datei, welche auf einmal eine "WebMarkierung" aufweisen soll.

    xXlJONASLXx schrieb:

    Die Datei ist 1kb groß
    Wie ist die Pixel-Größe?
    Vielleicht machst Du ein neues Mini-Projekt, das den Effekt reproduziert, machst ne ZIP draus (ohne .vs, obj und bin-Verzeichnis) und hängst es an den Post.
    Dann können wir das Problem untersuchen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!