Labels variabel ansprechen

  • VB.NET

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Labels variabel ansprechen

    Hallo und Guten Abend,

    nach langen und intensiven mitlesen in diesen Forum, was mir schon sehr weiter geholfen hat bin ich jetzt an einen Punkt wo ich euch um Hilfe bitten müsste. :D

    Momentan befinde ich mich noch am Anfang und in einer Lernphase was die Programmierung mit vb.net angeht daher bitte ich um ein bisschen Nachsicht. :D
    Danke. :thumbsup:



    Nun zu meinen Problem:
    In meiner Form habe ich ein "TableLayoutPanel" das ich in 20 Felder unterteilt habe.
    In 10 von diesen 20 Felder habe ich Panels und darin wiederum Labels. Die Panels und Labels sind nur durch Nummern im Namen getrennt.


    Hier mal ein Beispiel:
    In Feld 1 befindet sich Panel1 und darin dann Label1
    In Feld 2 befindet sich Panel2 und darin dann Label2

    Dies Labels würde ich jetzt gerne dynamisch in einer Schleife ändern. Habe dazu auch schon einen Versuch gestartet der so aussieht:

    VB.NET-Quellcode

    1. Panel1.Controls("Label" & i).text = "Test"


    Allerdings komme ich jetzt nicht mehr weiter ?( ?( , denn ich müsste irgendwie das Panel und das Label variabel ansprechen in etwa so:

    VB.NET-Quellcode

    1. Me.Controls("Panel" & i).Controls("Label" & i).text = "Test"


    Leider funktioniert dies so nicht "System.Null.ReferenceException" ist die Folge.
    Ich hoffe ihr könntet mir da weiter helfen, dies würde mir meine Aufgabe echt erleichtern.


    Vielen Dank bereits im Voraus
    Grüße Daniel
    Meinst du das?

    VB.NET-Quellcode

    1. Label1.Text = "Text"


    Label1 -> Der Label, dessen Text du verändern möchtest
    Text -> Text des Labels

    Außerdem musst du nicht sowas kompliziertes machen, es geht viel einfacher.


    Do Until Nothing IsNot Nothing
    Console.WriteLine("Viel Spaß dabei, mit diesen Code deine Zeit zu verschwenden, und zwar für immer!")
    Loop
    So?

    VB.NET-Quellcode

    1. Do Until variable Is value
    2. Label1.Text = "Bitte Warten"
    3. Loop
    Do Until Nothing IsNot Nothing
    Console.WriteLine("Viel Spaß dabei, mit diesen Code deine Zeit zu verschwenden, und zwar für immer!")
    Loop
    @'Kilobyte' Nein. Das blockiert Dir den kompletten UI-Thread und ist auch überhaupt nicht das, was der TE sucht. Eine Do-While-Schleife macht hier ja mal gar keinen Sinn? ?(
    @**Daniel** Spreche Dein Panel direkt an und verwende dessen Controls-Property und filtere die Labels mit der OfType-Extension (LINQ). Dann kannst Du bequem mit For Each durch diese Collection iterieren und die Labels anpassen.

    Grüße
    #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 :!:
    Danke für euerer Antworten.

    @Kilobyte: deine Lösung ist für meinen Fall nicht das Richtige da hast du mich glaube ich falsch verstanden.

    @Trade: ich müsste die Panels und die Labels variable abfragen und nicht jedes Panel einzeln.
    In einer Schleife soll dann im ersten Durchlauf das Label1 im Panel 1 geändert werden, im 2.Durchlauf das Label 2 im Panel 2, im 3.Durchlauf usw....

    Ist das so überhaupt möglich?
    @Trade Ich habe ja auch gefragt, ob das "so" gut ist. Man könnte ja ein Thread dafür benutzen... Aber egal, da @**Daniel** was anderes gesucht hat.
    Do Until Nothing IsNot Nothing
    Console.WriteLine("Viel Spaß dabei, mit diesen Code deine Zeit zu verschwenden, und zwar für immer!")
    Loop

    **Daniel** schrieb:

    Ist das so überhaupt möglich?
    Ja, dann mach' dasselbe für die Panels und verschaltel die Schleifen einfach.

    Grüße
    #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 :!:
    @**Daniel** Meinst Du so was (Form, Button, 4 Label):

    VB.NET-Quellcode

    1. Private Counter As Integer = 0
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim lbl() = {Label1, Label2, Label3, Label4}
    4. lbl(Counter Mod 4).Text = Counter.ToString ' Index auf Anzahl begrenzen
    5. Counter += 1
    6. End Sub
    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!
    Guten Morgen und danke für die Antworten.


    Hab schon ein bisschen romprobiert aber komme leider zu keinen Ergebnis. X(

    In meiner Form liegt ein TableLayoutPanel, in jedem Kästchen dann ein Panel und darin das Label.

    Wie schaffe ich es jetzt diese Labels in jeden Kästchen variabel in einer Schleife anzusprechen? ?(

    Sorry für die vielen Fragen, aber ich stehe total auf der Leitung.

    Danke Daniel
    @**Daniel** Hast Du meinen Code ausprobiert?
    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!

    **Daniel** schrieb:

    Wie schaffe ich es jetzt diese Labels in jeden Kästchen variabel in einer Schleife anzusprechen?

    Trade schrieb:

    Spreche Dein Panel direkt an und verwende dessen Controls-Property und filtere die Labels mit der OfType-Extension (LINQ). Dann kannst Du bequem mit For Each durch diese Collection iterieren und die Labels anpassen.


    VB.NET-Quellcode

    1. For Each panel As Panel In tableLayoutPanel1.Controls.OfType(Of Panel)()
    2. For Each label As Label In panel.Controls.OfType(Of Label)()
    3. label.Text = "Test"
    4. Next
    5. Next
    Verstehst du den Code auch?
    Und was meinst Du mit "nur ein Label ändern"?

    Grüße
    #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 :!:
    Danke für die schnelle Antwort funktioniert auch sehr gut so. :thumbsup:

    Den Code verstehe ich schon.
    Mit nur ein Label ändern meinte ich, dass nur von einen Label in jedem Panel die .Text Eigenschaft geändert werden soll.

    Allerdings habe ich jetzt festgestellt das die Schleife um ein vielfaches zum Laden länger braucht als wenn die Labels einzeln angesprochen werden.
    Dann erkläre mal bitte Zeile für Zeile. ;)

    Grüße
    #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 :!:

    VB.NET-Quellcode

    1. For i = 1 To 10
    2. If Not tlp_7.Controls("pan_pal" & i).Controls("lbl_ncp" & i).Text = Nothing Then
    3. temp_ncp = tlp_7.Controls("pan_pal" & i).Controls("lbl_ncp" & i).Text
    4. Dim fs As System.IO.FileStream
    5. fs = New System.IO.FileStream(Netzlaufwerk & "\" & tlp_7.Controls("pan_pal" & i).Controls("lbl_ncp" & i).Text & ".jpg", IO.FileMode.Open, IO.FileAccess.Read)
    6. Dim pic As PictureBox
    7. pic = tlp_7.Controls("pcb_pal" & i)
    8. pic.Image = System.Drawing.Image.FromStream(fs)
    9. fs.Close()
    10. End If
    11. Next


    tlp_7 = TableLayoutPanel
    pan_pal = Panel
    lbl_ncp = Label
    pcb_pal = Picturebox
    Netzlaufwerk = Variable

    Ich hoffe der Schock ist nicht allzu groß was meinen Code anbelangt. Bin einfach noch blutiger Anfänger
    Wie ich erkennen kann, nimmst du für jede Picturebox ein eigens dafür angelegtes Label...
    Dann kannst du eigentlich die Controls direkt ansprechen...
    Nimm dazu eine Dictionary (Of Label, Picturebox) und befülle sie mit deinen zusammengehörenden Controls.
    Durchlaufe diese Dictionary und weise einfach der ImageLocation-Eigenschaft jeder Picturebox den zugeteilten Bild-Pfad vom Netzlaufwerk und Bildnamen (Label.Text) zu...
    msdn.microsoft.com/en-us/libra…gelocation(v=vs.110).aspx
    Siehe Codesnippet:

    VB.NET-Quellcode

    1. Dim dictPicturBox As New Dictionary(Of Label, PictureBox) From {{Label1, PictureBox1}, {Label2, PictureBox2}, {Label3, PictureBox3}, ...}
    2. For Each kvp In dictPicturBox
    3. If Not String.IsNullOrWhiteSpace(kvp.Key.Text) Then
    4. dictPicturBox.Item(kvp.Key).ImageLocation = Path.Combine(Netzlaufwerk, kvp.Key.Text & ".bmp")
    5. End If
    6. Next

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