Mehrere PictureBoxen per For schleife ansprechen

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von TVX.

    Mehrere PictureBoxen per For schleife ansprechen

    Hallo liebe Community.
    Ich versuche gerade per For schleife mehrere PictureBoxen anzusprechen. Sie haben die Namen Feld1 - Feld9. Also es sind insgesamt 9 PictureBoxen.
    Im Form load weise ich einem Array (arrayTest(8)) 1 oder 0 zu (Diese werden aus einer Textdatei gelesen).
    Jetzt soll wenn z.B. im arrayTest(1) eine 1 drinne steht, soll sich die PictureBox färben.
    Mein code bislang:

    Quellcode

    1. For i = 0 To 8
    2. If arrayTest(i) = "1" Then
    3. Controls("feld" & i + 1).BackColor = Color.Gray
    4. End If
    5. Next


    Allerdings färbt sich die PictureBox nicht Grau.
    Weiß einer woran es liegt?

    Ausschließen kann man das im Array keine Werte vorliegen. Das habe ich schon überprüft.

    Danke im vorraus.
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    @Kilian_98 Woher kommt den dein Laufindex i? Außerdem werden dann alle Controls betrachtet. Du müsstest also noch die Bedingung TypeOf bla Is PictureBox einfügen.
    @TheTrust3343 Me.Controls(...) ist unsauber. Ich würde es so in der Art machen.

    VB.NET-Quellcode

    1. boxes.AddRange({PictureBox1, PictureBox2, PictureBox3, PictureBox4, PictureBox5, PictureBox6})
    2. Dim x() As String = {"1", "0", "1", "0", "1"} 'Beispielsimulation
    3. For i As Integer = 0 To x.Length - 1
    4. If Integer.Parse(x(i)) = 1 Then
    5. boxes(i).BackColor = Color.Gray
    6. Else
    7. boxes(i).BackColor = Color.Black
    8. End If
    9. Next

    LaMiy schrieb:

    Me.Controls(...) ist unsauber. Ich würde es so in der Art machen.

    Hm, warum genau siehst Du das als unsauber? Ich meine, das gibt Dir halt die Controls zurück und um alle aufzurufen ist das sicherlich die schönste und leichteste Methode, nicht wahr?
    Man kann dort ja noch nen OfType anhängen und da als Typargument die Picture box rein. Feddich.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Variabel :

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim liste() As String = IO.File.ReadAllLines("C:\Users\zeus\Desktop\test.txt")
    5. For i = 0 To liste.Length - 1
    6. Dim Farbe As Color = Color.FromName(liste(i).Split(CChar(":"))(1))
    7. Controls(liste(i).Split(CChar(":"))(0)).BackColor = Farbe
    8. Next
    9. End Sub
    10. End Class


    Textdatei würde dann zb. so aussehen :

    PictureBox1:Green
    PictureBox3:Blue
    PictureBox2:Yellow
    PictureBox4:Red


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „TVX“ ()

    LaMiy schrieb:

    VB.NET-Quellcode

    1. Dim x() As String = {"1", "0", "1", "0", "1"} 'Beispielsimulation
    ==>

    VB.NET-Quellcode

    1. Dim x() As Integer = {1, 0, 1, 0, 1} 'Beispielsimulation
    oder Boolean
    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!
    Ja das is richtig das schrieb er :)

    VB.NET-Quellcode

    1. Dim liste() As String = IO.File.ReadAllLines("C:\Users\zeus\Desktop\test.txt")
    2. For i As Integer = 0 To Me.Controls.OfType(Of PictureBox).Count - 1
    3. If liste(i) = "1" Then
    4. Controls("PictureBox" & i + 1).BackColor = Color.Gray
    5. End If
    6. Next


    Diese werden aus einer Textdatei gelesen:
    0
    1
    1
    0

    TVX schrieb:

    Ja das is richtig das schrieb er :)

    VB.NET-Quellcode

    1. Dim liste() As String = IO.File.ReadAllLines("C:\Users\zeus\Desktop\test.txt")
    2. For i As Integer = 0 To Me.Controls.OfType(Of PictureBox).Count - 1
    3. If liste(i) = "1" Then
    4. Controls("PictureBox" & i + 1).BackColor = Color.Gray
    5. End If
    6. Next


    Diese werden aus einer Textdatei gelesen:
    0
    1
    1
    0



    Ich frage mich ehrlich gesagt wieso es bei dir funktioniert .?(
    Hab es genauso gemacht wie du. Mit einem Button dort dann die for schleife eingebaut und auch die Zeilen auslesen. Nun sagt er mir allerdings: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
    In dieser Zeile:
    Controls("PictureBox" & b + 1).BackColor = Color.Gray

    Habe die PictureBoxen sogar erneut erstellt. Diese heißen jetzt statt Feld1 - 9, PictureBox1 - 9.
    Weiß einer was da los ist?
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TheTrust3343“ ()

    Woher kommt b ?

    Außerdem, Option Strict On !
    Und warum tüfteln wir noch ? Die mMn beste Lösung ist mehr oder weniger von TVX:

    Visual Basic-Quellcode

    1. For Each ctrl As Control In Me.Controls.OfType(Of PictureBox)
    2. Dim pb = DirectCast(ctrl, PictureBox)
    3. If pb.Name Like "PictureBox\d?" Then
    4. pb.BackColor = Color.Gray
    5. End If
    6. Next

    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ErfinderDesRades schrieb:

    VB.NET-Quellcode

    1. If pb.Name Like "PictureBox\d?" Then
    Sofern die Controls dieser Namenskonvention folgen.
    Wenn da eine automatische Umbenennung durchgeführt wird, geht das vor die Hose. ;(
    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!
    So geht auch

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim liste() As String = IO.File.ReadAllLines("C:\Users\zeus\Desktop\test.txt")
    3. MsgBox(liste(0))
    4. For i As Integer = 0 To Me.Controls.OfType(Of PictureBox).Count - 1
    5. If Not liste(0) = Nothing AndAlso liste(0).Substring(i, 1) = "1" Then
    6. Controls("PictureBox" & i + 1).BackColor = Color.Gray
    7. End If
    8. Next
    9. End Sub​


    So in Datei schreiben :

    0101

    Durch das nutzen - einstellen der gelesenen Zeilen - liste(0) = 1. Zeile -
    lassen sich dann durch die selbe Funktion mit einer anderen Zeile auch andere Controls aus einer Datei steuern -- muss los !

    TVX schrieb:

    VB.NET-Quellcode

    1. Controls("PictureBox" & i + 1).BackColor = Color.Gray

    RodFromGermany schrieb:

    Sofern die Controls dieser Namenskonvention folgen.
    Wenn da eine automatische Umbenennung durchgeführt wird, geht das vor die Hose. ;(
    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!
    Abgesehen davon, @TVX, wieso verwendest du immer noch keine Option STRICT ON????
    Was soll denn hier

    TVX schrieb:

    VB.NET-Quellcode

    1. Controls("PictureBox" & i + 1)

    rauskommen? i ist eine Zahl, was wird zuerst gemacht? i intern zum String konvertiert, mit PictureBox verkettet, dann 1 zu String konvertiert und dazu verkettet? Dann wäre der Name falsch: PictureBox51 statt PictureBox6.
    Oder wird erst i+1 gerechnet, dann intern zum String konvertiert (weil Option STRICT OFF) und erst dann verkettet? Dann wäre PictureBox6.
    Wenn man gleich richtig sauberen Code macht, passiert sowas nicht.
    @sonne75

    Ein Ausdruck wie:

    VB.NET-Quellcode

    1. Dim s As String = "huhu" & 1 + 33 + 69


    ist OPTION-STRICT ON konform. Der &-Operator erledigt dies.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Zuerst wird der mathematische Ausdruck nach den Regeln verarbeitet und letztendlich zu String konvertiert.

    VB.NET-Quellcode

    1. Dim s As String = "huhu" + Conversions.ToString(103)


    Dekompiliert sieht das so aus. C# verhält sich meines WIssens nach hier anders. Hier wird keine Berechnung durchgeführt, sondern einfach verkettet.

    Ausgabe VB für o. g. Beispiel: "huhu103"
    Ausgabe C# für o. g. Beispiel: "huhu13369" (Wobei bei C# der +-Operator verwendet wird, da & nicht existiert.)

    Also irreführend, aber nicht gegen die Regel.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o