Hash key als variable in label name

  • VB.NET

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

    Hash key als variable in label name

    Hallo zusammen,

    ich lese hier im Forum schon längere Zeit, weil ich vor knapp einem Monat mit dem Programmieren in vb.net (privater Natur) begonnen habe. Dazu nutze ich das Visual Studio Community 2013. Ich habe bereits mehrjährige Programmiererfahrung in Perl sammeln können, aber vb ist neu für mich.

    Nun habe ich ein Problem, welches ich nicht in den Griff bekommen: ich habe einen hash definiert in dem mehrere keys mit values enthalten sind. Jetzt würde ich gern in einem Formular die Eigenschaft 'Test' von unterschiedlichen Labels mit dem value eines hash Elementes versehen:

    VB.NET-Quellcode

    1. For Each element In hashTurnierdaten
    2. Me.Controls("lbl" & element.key).Text = element.value
    3. Next


    Leider bleiben alle Eigenschafte 'Text' leer. Im Output Fenster bekomme ich die Meldung 'A first chance exception of type 'System.NullReferenceException' occurred in Microsoft.VisualBasic.dll'. Eine Suche im Internet hat mir nicht wirklich weitergeholfen.

    Die Variablendefinition sieht so aus:

    VB.NET-Quellcode

    1. Public hashTurnierdaten As Hashtable = New Hashtable


    Die key-value Beziehungen sehen so aus:
    key1 - value1
    key2 - value2
    key3 - value3

    Folgende Zuweisung in der Schleife funktioniert:

    VB.NET-Quellcode

    1. lblkey1.Text = element.value


    Meine Absicht ist den Labelnamen dynamisch mit einem Text zu versehen.

    Nun hoffe ich auf die guten Ideen von Euch ;)

    mfg André

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

    Willkommen im Forum. :?:

    freelancer schrieb:

    Labelnamen
    werden zur Entwicklungszeit vorgegeben und sind fix.
    Meinst Du, Labels im Programm einen Text zuzuweisen? Dann bräuchtest Du pro Value ein Label:

    VB.NET-Quellcode

    1. Label1.Text = value1
    2. Label2.Text = value2
    3. Label3.Text = value3
    Wenn es mehr Daten werden, überleg Dir, die Ausgabe in Tabellenform in einem DataGridView zu machen.
    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!
    Vielen Dank für die Antwort.

    Meinst Du, Labels im Programm einen Text zuzuweisen? Dann bräuchtest Du pro Value ein Label:
    Ja, das möchte ich.

    Ich möchte gern die Property Text an unterschiedlichen Labelnames ändern.
    Die Labelnames lauten:
    lblkey1, lblkey2, lblkey3, ....

    Meine Hash keys lauten:
    key1, key2, key3, ....

    Nun möchte ich in einer Schleife den Text aller Labels ändern und dazu die Key-Value beziehen nutzen. Ziel wäre:
    lblkey1.text auf key1.,
    lblkey2.text auf key2.,
    lblkey3.text auf key3.value zusetzen.

    Den Labelnamen möchte ich nun dynamisch erstelle:

    VB.NET-Quellcode

    1. for each element in hash
    2. me.controls("lbl" & element.key).text = element.value
    3. next


    So wollte ich gern den unterschiedlichen Labels einen Text zuweisen.

    mfg André


    PS: das mit dem DataGridView muss ich mir anschauen, da ich das (noch) nicht kenne ;)

    freelancer schrieb:

    Ja, das möchte ich.
    Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim lbl() = {Label1, Label2, Label3, Label4, Label5}
    2. Dim txt() = {"aa", "bb", "cc", "dd", "ee"}
    3. For i = 0 To lbl.Length - 1
    4. lbl(i).Text = txt(i)
    5. 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!
    Ohlala,

    also, key1, key2, etc. waren Beispiele. Ich dachte, ich hätte "nur" ein syntaktisches oder logisches Problem bei der Me.Controls Zuweisung.
    Hier der Programmcode:

    VB.NET-Quellcode

    1. For Each element In hashTurnierdaten
    2. Try
    3. Debug.Print(element.key & " - " & element.value)
    4. Me.Controls("lbl" & element.key).Text = element.value
    5. Catch ex As Exception
    6. End Try
    7. Next


    Der Debug gibt die 'richtigen' Keys und Values zurück.
    Die Labels heißen: lblTurnierveranstalter, lblTurniername, lblDisziplin, lblDatum, lblOrt
    Der Debug Output:

    VB.NET-Quellcode

    1. Datum - Test-Datum
    2. Turniername - Test-Turniername
    3. Veranstalter - Test-Veranstalter
    4. Ort - Test-Ort
    5. Disziplin -


    @RodFromGermany: die direkte Zuweisung über:

    VB.NET-Quellcode

    1. lblTurniername.Text = element.value
    funktioniert einwandfrei!!!

    Es funktioniert nur über die Zuweisung mit dem

    VB.NET-Quellcode

    1. Me.Controls("lbl" & element.key).Text = element.value
    nicht, leider.


    mfg André

    freelancer schrieb:

    VB.NET-Quellcode

    1. Me.Controls("lbl" & element.key)
    ist ein Control, nicht aber ein Label.
    Du musst die Variable explizit in ein Label casten, dann geht es:

    VB.NET-Quellcode

    1. DirectCast(Me.Controls("lbl" & element.key), Label).Text = "bla"
    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!
    Directcast funktioniert leider auch nicht:

    VB.NET-Quellcode

    1. For Each element In hashTurnierdaten
    2. Try
    3. Debug.Print(element.key & " - " & element.value)
    4. DirectCast(Me.Controls("lbl" & element.key), Label).Text = "hallo"
    5. Catch ex As Exception
    6. Debug.Print("error with:" & element.key)
    7. End Try
    8. Next


    Debug Output:

    Quellcode

    1. Datum - 25.03.2015
    2. A first chance exception of type 'System.NullReferenceException' occurred in ATP.exe
    3. error with:Datum
    4. Turniername - Test-Tuniername
    5. A first chance exception of type 'System.NullReferenceException' occurred in ATP.exe
    6. error with:Turniername
    7. Veranstalter - Test-Turnierveranstalter
    8. A first chance exception of type 'System.NullReferenceException' occurred in ATP.exe
    9. error with:Veranstalter
    10. Ort - Test-Ort
    11. A first chance exception of type 'System.NullReferenceException' occurred in ATP.exe
    12. error with:Ort
    13. Disziplin - Test-Disziplin
    14. A first chance exception of type 'System.NullReferenceException' occurred in ATP.exe
    15. error with:Disziplin
    16. The thread 0x2670 has exited with code 259 (0x103).
    17. The thread 0x1fcc has exited with code 259 (0x103).
    18. The program '[4976] ATP.vshost.exe' has exited with code 0 (0x0).

    Das muss aber doch irgendwie zu machen sein. Muss ich vielleicht den Key noch umwandeln in String (dürfte er aber schon sein)?

    mfg André
    Du musst noch 5 Schritte zurückgehen, an den Anfang.
    Zum Beispiel gewöhn dir an, ganze Methoden zu schreiben, und zu posten - etwa so:

    VB.NET-Quellcode

    1. Private Sub UpdateLabels()
    2. For Each element In hashTurnierdaten
    3. Try
    4. Debug.Print(element.key & " - " & element.value)
    5. Me.Controls("lbl" & element.key).Text = element.value
    6. Catch ex As Exception
    7. End Try
    8. Next
    9. End Sub


    Dann - eminent wichtig: Option Strict On, und den Deppen-Namespace entfernen.
    Gugge Visual Studio - Empfohlene Einstellungen

    Vorher nix weiter-coden - du baust nur lauter Fehler ein.

    Dann den TryCatch wegmachen. Glaub mir das einfach - Trycatch verhindert debuggen, das sollte man nur einsetzen, wenn nach menschlichem Ermessen keine Fehler mehr auftreten - für die Fehler, die dann trotzdem noch auftreten ;)
    Bei dir aber treten Fehler auf, also mach den TryCatch weg, und korrigiere die Fehler (musste vmtl. hier posten)
    Meist hängen die Leuts wie Sekundenkleber am TryCatch, also vlt. kann dich TryCatch ist ein heißes Eisen überzeugen.
    Vlt. auch nicht, denn vmtl. kannst du vielen Argumenten noch gar nicht folgen.

    Also - ToDo:
    1. Visual Studio - Empfohlene Einstellungen
    2. richtige Methode (naja - ist jetzt ja)
    3. TryCatch rausschmeißen
    4. Fehlermeldung posten - gugge auch Exceptions, und was sie uns sagen wollen
    Vlt auch hilfreich: Dann können wir deine Posts besser lesen.
    Nimm das try-catch heraus, damit versteckst du nur die vollständige Fehlermeldung von der IDE, die dir sagt, wo das Problem ist.

    NullReferenceExeption tritt wohl auf, weil das Me.Controls("lbl" & element.key) null ist.
    Sind deine Labels auch direkt auf der Form plaziert oder auf anderen Containern (zB. Panel)?
    Bei zweitem Fall müsstest du die Subcontrols vom Container ansprechen, nicht von der Form.
    Jou.

    freelancer schrieb:

    VB.NET-Quellcode

    1. Me.Controls("lbl" & element.key)
    Dieses Label gibt es nicht.
    Also:
    Nimm nur im Designer erstelltre Controls, arbeite nicht mit deren Namen. Das führt ausnahmslos immer zum Chaos.
    Sieh Dir das Beispiel in Post #5 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!
    Hallo zusammen,

    ich erkenne meine Thread gar nicht wieder ?(

    Vieles von dem was ihr sagt kann ich gar nicht bewerten, weil ich ganz am Anfang stehe!!!

    Ich werde mich nun um den Hinweis auf DirectCast und das "Nichtverwenden" des Try kümmern und mich dann wieder melden :)

    Ich danke allen vorab ...

    mfg André

    *Posting wurde aus themenfremdem Thread hierher verschoben*

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

    Ich habe im Internet und in Fachbüchern immer wieder gelesen mit 'sprechenden' Namen die Label zu benennen.

    Es muss doch eine Möglichkeitkeit geben den zu adressierenden Label dynamisch anzusprechen. Der Post Nr.5 arbeitet ja mit festen Labelnamen

    Quellcode

    1. Dim lbl() = {Label1, Label2, Label3, Label4, Label5}
    . Geht das generell nicht, was ich da vorhabe? Also dynamisch den Label anzusprechen?

    @CounterBug: die Labels sind im aktuellen Formular.

    Wie gesagt: der Hash funktioniert und liefert die richtigen Werte.

    VB.NET-Quellcode

    1. Private Sub MainInfo_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. 'lblVeranstalter.Text = hashTurnierdaten("Veranstalter")
    3. 'lblTurniername.Text = hashTurnierdaten("Turniername")
    4. 'lblDisziplin.Text = hashTurnierdaten("Disziplin")
    5. 'lblOrtDatum.Text = hashTurnierdaten("Ort") & ", " & hashTurnierdaten("Datum")
    6. For Each element In hashTurnierdaten
    7. If element.key = "Veranstalter" Then
    8. Debug.Print(element.key & " - " & element.value)
    9. DirectCast(Me.Controls("lbl" & element.key), Label).Text = "hallo"
    10. Else
    11. Debug.Print("error:" & element.key & " - " & element.value)
    12. End If
    13. Next
    14. End Sub


    Ich hatte die Idde mit dem dynamischen Zuordnen des Labelname, weil ich in meinem Hash weitere Labelnamen definiert habe, welche aber in dieser Routine nicht gebraucht werden. Die Zeilen 2-5 funktionieren und bestätigen mir zumindest den korrekten Inhalt des Hashes. Da ich den Try herausnehmen sollte, habe ich die Schleife auf nur einen Hash-Key begrenzt, um den DirectCast auszuprobieren. Fehlermeldung ist wie gehabt:

    Quellcode

    1. error:Datum - 25.03.2015
    2. error:Turniername - Test-Tuniername
    3. Veranstalter - Test-Turnierveranstalter
    4. A first chance exception of type 'System.NullReferenceException' occurred in ATP.exe
    5. The program '[8860] ATP.vshost.exe' has exited with code -1 (0xffffffff).
    ich sags noch einmal (post#9): Mit deinen VS-Einstellungen kannst du nicht vernünftig programmieren.
    ZB das Konzept "Datentyp" muss dir so unbekannt bleiben.
    Oder kannst du angeben, welchen Datentyp Element hat?
    Nur die richtigen Vor-Einstellungen bringen dich zB. darauf, dass der Typ HashTable total veraltet ist, untypisiert, und man sollte stattdessen Dictionary(Of TKey, TValue) benützen.

    Es nervt dich sicher, und du willst vorankommen, und es scheint dir ja auch, dass du voran kommst.
    Nur kannst du alles wieder in die Tonne treten, wenn du dich später iwann überwindest, auf vernünftige Voreinstellungen zu migrieren.

    Also mach das besser von Anfang an, und gewöhn dir keinen Mist an.

    Sicher gehe ich dir damit auf die Nerven, und du maulst, dass dir hier nicht geholfen wird. Wie gesagt: Auf der Basis, auf der du stehst, ist dir zu helfen nicht sinnvoll, sondern schädlich. Weil mit jeder weiteren Zeile, die du schreibst, werden die schlechten Gewohnheiten weiter eingeschliffen.
    Imo bedeutet Hilfe hier, dass man dir zu einer tragfähigen Basis verhilft, und dazu musste einfach erstmal machen, was in Visual Studio - Empfohlene Einstellungen steht.
    Ist ja auch nicht weiter schwierig, was da steht, und erst danach kanns eiglich losgehen.
    Gibt es iwie ein Problem mit dem, was da steht?

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades Jou.

    freelancer schrieb:

    weil ich ganz am Anfang stehe!
    Vielleicht wendest Du Dich zunächst einfacheren Problemen zu, gugst Du hier.
    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!
    Vielen Dank für Eure Hilfe.

    @RodFromGermany: ich habe bereits ein (größeres) Projekt, das ich angehen möchte und werde mir nun erst einmal Gedanken, wie ich die anstehenden Aufgaben lösen möchte.

    Vielen Dank vorab an alle.



    mfg André