Mit for-each-Schleife die Farbe von allen PictureBoxen der Reihe nach ändern

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

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    Mit for-each-Schleife die Farbe von allen PictureBoxen der Reihe nach ändern

    Hallo,
    ich habe jetzt schon ein paar stunden versucht mein Problem zu lösen. Leider ist mir das nicht gelungen.
    Und zwar geht es um folgendes Problem in VB.NET:

    Ich möchte mit einer for-each-next Schleife der Reihe nach alle Pictureboxen auf einem Panel von weiß zu rot einfärben.

    Es ist ZWINGEND notwendig, dass dies der Reihe nach geschieht. Heißt: erst PictureBox3, dann PictureBox4, dann PictureBox5, dann PictureBox7, dann Picturebox20 usw.

    Bei meinem Code funktioniert das alles ganz super, jedoch macht die Schleife es rückwärts. heißt: erst die neueste PictureBox -> erst Picturebox20, dann Picturebox7, dann PictureBox5, dann PictureBox4, dann PictureBox3.

    Was muss ich nun anders in meinen Code schreiben, damit die Schleife alles der Reihe nach formatiert von UNTEN nach OBEN.

    Mein Code:

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. For Each Picturebox In Panel2.Controls
    3. Picturebox.Backcolor = Color.Red
    4. MsgBox ("Picturebox rot gefärbt")
    5. Next
    6. End Sub


    Vielen Dank schon mal für eure Hilfe, denn diese benötige ich gerade wirklich sehr... ?(

    Gruß Max
    @max-hof Willkommen im Forum. :thumbup:
    So was:

    VB.NET-Quellcode

    1. For Each pb In Panel1.Controls.OfType(Of PictureBox)()
    2. pb.BackColor = Color.Black
    3. Next
    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!
    *Vollzitat entfernt*

    Hallo! :)
    Leider fängt er hier auch mit der zuletzt erstellten PictureBox an.. :( Es muss zwingend chronologisch angefangen werden. Heißt: Wenn auf dem Panel PictureBox3, PictureBox4, PictureBox5 und PictureBox7 vorhanden sind, darf nicht als erstes Picturebox7, dann Picturebox5, ... gefärbt werden, sondern Chronologisch nach PictureBox-Name erst PictureBox3, dann PictureBox4, ...

    Ich hoffe ich verlange hier nichts unmögliches.. :( Danke schon mal!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @max-hof Du kannst gern alle Controls in eine List(Of PictureBox) packen, diese nach Deinen Gutdünken sortieren und dann abarbeiten.
    Und:
    Unterlass das vollständige Zitieren von Posts über Deinen, das widerspricht den Forums-Regeln.
    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!
    Hallo,
    Das mit dem TabIndex hilft leider auch nichts.

    @RodFromGermany das habe ich gerade eben Mal getestet, jedoch Haut das ganze mit dem Code nicht so hin.. kannst du mir evtl Mal ein Beispiel geben oder einen Link schicken wie das dann aussehen soll? Hab jetzt nichts hilfreiches hierzu gefunden, oder mich einfach zu dumm zum suchen angestellt, da ich damit bisher noch nicht gearbeitet habe.. vielen Dank schon Mal :)
    @max-hof So was:

    VB.NET-Quellcode

    1. Dim pbList As New List(Of PictureBox)
    2. For Each pb In Panel1.Controls.OfType(Of PictureBox)()
    3. pbList.Add(pb)
    4. Next
    5. ' sortieren
    6. For Each pb In pbList
    7. pb.BackColor = Color.Black
    8. Next
    Was hat die Reihenfolge für eine Bewandtnis?
    Wie gelangen die PictureBoxen in das Panel (Designer, Code)?
    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!
    Hi @RodFromGermany
    Danke für das Beispiel, ich hatte so etwas ähnliches gefunden gehabt, muss ich dann morgen früh Mal schauen, ob das so funktioniert. Ich werde hierzu berichten...

    Pass auf, ich habe mehrere PictureBoxen als Buttons eingerichtet. Das Buttonlayout (Bild und Text) ist ein .PNG Datei, die als Background Image in der Picturebox eingefügt ist. Das hat den Vorteil, dass ich die Buttons beliebig vergrößern und verkleinern kann, ohne dass etwas verpixelt ist. Wenn ich das Programm nun auf einem Windows-Tablet starte, kann ich das Programm im Hoch- und Querformat verwenden. Dass die Picturebox-"Buttons" dann auch ausgerichtet werden, müssen diese von der Größe her angepasst und neu ausgerichtet werden. Wenn ich das nun über die Schleife mache, habe ich das Problem dass mir die Buttons bei neuausrichtung Spiegelverkehrt ausgerichtet werden, das heißt PictureBox1 war zuvor ganz links auf dem Panel und Picturebox7 war ganz rechts auf dem Panel. Nach dem Ausrichten allerdings ist Picturebox1 ganz rechts auf der Form und Picturebox7 ganz links.

    Ich habe das Beispiel mit den Farben genommen, da hierbei das gleiche Problem Auftritt, dies jedoch nicht so sehr umfangreich ist. Ich kann morgen gerne auch Mal den Code und Screenshots Posten wenn das evtl dem Verständnis helfen würde..

    Danke und Gruß

    Max
    Nuja, hier mal anders oder konkreter angegangen, mithilfe von RfGs Code:

    VB.NET-Quellcode

    1. Dim pbList As New List(Of PictureBox)
    2. 'hier einmalig die gewünschte Reihenfolge eintragen/einhalten, z.B. im Form_Shown-EventHandler
    3. pbList.Add(PictureBox1)
    4. pbList.Add(PictureBox8)
    5. pbList.Add(PictureBox7)
    6. pbList.Add(PictureBox5)
    7. pbList.Add(PictureBox9)
    8. pbList.Add(PictureBox2)
    9. 'und später dann
    10. For Each pb In pbList
    11. pb.BackColor = Color.Black
    12. Next
    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.

    max-hof schrieb:

    kann ich das Programm im Hoch- und Querformat verwenden
    Sieh Dir mal das FlowLayoutPanel an.
    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!
    wenn man schon eine picbox liste macht warum nicht gleich alles per code machen?

    so ungefähr: (Beispiel 1 Form mit 1 Panel, 2 Buttons, 1 Label)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Public pbList As New List(Of PictureBox)
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. For i As Integer = 0 To 5
    5. pbList.Add(New PictureBox)
    6. pbList(i).Top = 10
    7. pbList(i).Left = 10 + i * 50
    8. pbList(i).Width = 30
    9. pbList(i).Height = 30
    10. pbList(i).BackColor = Color.Red
    11. pbList(i).Name = "PictureBox_" & i.ToString
    12. Panel1.Controls.Add(pbList(i))
    13. AddHandler pbList(i).Click, AddressOf PiBox_Click_handl
    14. Next
    15. End Sub
    16. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    17. pbList(0).BackColor = Color.Black
    18. End Sub
    19. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    20. pbList(3).Top = 100
    21. End Sub
    22. Private Sub Pibox_Click_handl(ByVal Sender As Object, ByVal e As System.EventArgs)
    23. Dim pibox As PictureBox = DirectCast(Sender, PictureBox)
    24. Label1.Text = "PictureBox: " & pibox.Name & " wurde geclikt!"
    25. End Sub
    26. End Class

    oder wie schon erwähnt ein FlowLayoutPanel könnte für deine zwecke auch gehen.
    Hallo,

    vielen Dank für die zahlreichen Rückmeldungen. Sorry, dass ich mich erst jetzt melde, aber ich war noch ein wenig am basteln und ausprobieren.
    @RodFromGermany hatte genau das, wonach ich gesucht habe! Ich konnte die PicturBoxen der Schleife wie folgt von vorne nach hinten sortieren:

    VB.NET-Quellcode

    1. Dim pbList As New List(Of PictureBox)
    2. For Each pb In Panel1.Controls.OfType(Of PictureBox)()
    3. pbList.Add(pb)
    4. Next
    5. ' sortieren
    6. pbList = pbList.OrderBy(Function(s) s.Name).ToList
    7. For Each pb In pbList
    8. MsgBox("")
    9. pb.BackColor = Color.Black
    10. Next


    Vielen Dank! Das Thema ist somit für mich gelöst! :)

    max-hof schrieb:

    Das Thema ist somit für mich gelöst
    So lange Du die PictureBoxen nicht umbenennst.
    Und die Verwendung der initialen Designer-Namen ist kein guter Programmierstil.
    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!
    Nee, ist sie nicht !
    Die Funktion von Namen, ist zu beschreiben, was die Variable/Methode, et cetera denn so darstellt bzw. macht.