my.settings dynamisch ansprechen möglich??

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    my.settings dynamisch ansprechen möglich??

    Hallo zusammen,

    Es gibt in meinen my.settings mehrere Variablen unter denen eine bestimmte Einstellung als String abgelegt werden soll. Die Variablen lauten my.settings.ma54_aktiv , my.settings.ma55_aktiv usw.
    Nun lasse ich bei meinem Programmstart prüfen ob die Maschinen im Netzwerk erreichbar sind. Dies geschieht mittels einer Sub, die ich nacheinander mit den ensprechenden Maschinennummern als übergebene Variable aufrufe.

    Nun dachte ich, dass ich dabei auch den Namen der my.settings Variable flexibel zusammenbauen kann, was rein optisch mittels Kontrollausgabe in einer Textbox auch funktioniert. Aber es werden keine Änderungen / neuen Werte in die my.settings Variable gespeichert. Als Gegenprobe habe ich mal direkt einen Test mit: my.settings.ma54_aktiv = "an" gemacht, was wunderbar klappte.

    Schaut euch mal den Code-Ausschnitt an, vielleicht können wir das lösen?!

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub maschinen_check(ByRef ma_nummer As Integer)
    2. Select Case ma_nummer
    3. Case 54
    4. HTTPAdresse = My.Settings.ma_name54
    5. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    6. Case 55
    7. HTTPAdresse = My.Settings.ma_name55
    8. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    9. Case 56
    10. HTTPAdresse = My.Settings.ma_name56
    11. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    12. Case 29
    13. HTTPAdresse = My.Settings.ma_name29
    14. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    15. Case 30
    16. HTTPAdresse = My.Settings.ma_name30
    17. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    18. Case 31
    19. HTTPAdresse = My.Settings.ma_name31
    20. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    21. Case 32
    22. HTTPAdresse = My.Settings.ma_name32
    23. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    24. End Select
    25. 'prüfen ob jeweilige URL überhaupt erreichbar ist
    26. lbl_status.Text = "Maschine " & ma_nummer & " wird geprüft..."
    27. 'wenn erreichbar "OK" setzen
    28. If URLcheck(HTTPAdresse, ma_nummer) = True Then
    29. Controls("grp_maschinen").Controls("lbl_chk" & ma_nummer).ForeColor = Color.Green
    30. Controls("grp_maschinen").Controls("lbl_chk" & ma_nummer).Text = "OK"
    31. MsgBox("aktuelle maschineaktiv Variable lautet: " & maschineaktiv) 'hier steht auch die korrekte Variable für die jeweilige Maschine, bspw. my.settings.ma54_aktiv!!!
    32. maschineaktiv = "an" 'aber hier schlägt der Versuch fehlt, einen Wert als String an diese my.setting zu übergeben / zu speichern
    33. My.Settings.Save()
    34. ...
    ==> seid .net zueinander :D <3 <==
    Nein, das geht nicht, da die Settings ein fester Namespace bzw. die Objekte davon fest integriert sind und Namespaces sind nicht mit Strings ansprechbar.
    #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 :!:
    Du frägst ja bereits die Nummer ab, also kannst Du es doch direkt angeben. ;)
    #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 :!:

    Axxxxxl schrieb:

    Case 54

    Damit hast Du ja die Info, dass die Nummer 54 ist, also kannst Du die entsprechende Setting doch direkt beim Namen aufrufen. ;)
    #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 :!:
    Aber wo?! Direkt in der Select-Anweisung geht ja noch nicht, da ja die Überprüfung auf Erreichbarkeit erst danach kommt.
    Der korrekte Eintrag müsste ja bspw.

    VB.NET-Quellcode

    1. My.Settings.ma54_aktiv = "an"
    bei positiver Erreichbarkeit lauten. Wo sollte ich aber nun diese explizite Zeile in der Sub unterbringen?!
    ==> seid .net zueinander :D <3 <==
    Ich verwende My.Settings nie, aber kann man da nicht eine List (Of T) ablegen?
    für T würde ich dann eine Klasse "Machine" verwenden, in der die Eigenschaften der Rechner definiert werden (Name, Nummer, IP-Adresse, isActive...).

    Ansonsten einfach auf My.Settings verzichten und die Struktur Serialisieren/Deserialisieren.


    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    noch einmal: Man kann in den Settings eine StringCollection anzulegen.
    List(Of String) geht auch, ist aber minimal umständlicher.
    Am einfachsten ist, eine StringCollection dort anzulegen. Das ist eine Collection von Strings, die enthält also viele Strings, und das scheint mir hier, was gebraucht wird.

    Trade schrieb:

    Nein, das geht nicht, da die Settings ein fester Namespace bzw. die Objekte davon fest integriert sind und Namespaces sind nicht mit Strings ansprechbar.
    Doch...

    VB.NET-Quellcode

    1. Dim x = My.Settings.Item("ma_name" & Number)
    Hier muss man nur auf die SettingsPropertyNotFoundException aufpassen...
    @VB1963 Dass das geht wusste ich nicht. IntelliSense sagt da ja nix zu. Das ist mal geil! Danke für den Hinweis.
    #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 :!:
    So wie ich das sehe, benutzt du als werte nur An und aus? Warum dann keine Boolean? Du könntest zum Beispiel eine Klasse schreiben, in der die Werte aus einer List(Of Boolean/String) abrufen kannst und kannst dann auch noch mit System.IO die Liste speichern bzw. Laden(in zum Beispiel einer Textfile) . LG

    Axxxxxl schrieb:

    VB.NET-Quellcode

    1. maschineaktiv = "My.Settings.ma" & ma_nummer & "_aktiv"
    Leg in Deinen Settings einen Integer-Wert an und feddich.
    Den aktuellen Namen generierst Du dann daraus im 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!

    VB1963 schrieb:

    Trade schrieb:

    Nein, das geht nicht, da die Settings ein fester Namespace bzw. die Objekte davon fest integriert sind und Namespaces sind nicht mit Strings ansprechbar.
    Doch...

    VB.NET-Quellcode

    1. Dim x = My.Settings.Item("ma_name" & Number)
    Hier muss man nur auf die SettingsPropertyNotFoundException aufpassen...


    Na super, zu spät gelesen. Ich hab nun alles in eigenen Timer gepackt, was wunderbar funktioniert. Aber ich werde das trotzem mal testen mit dem

    VB.NET-Quellcode

    1. Dim x = My.Settings.Item("ma_name" & Number)


    Vielen Dank euch allen !!!
    ==> seid .net zueinander :D <3 <==
    Timer sind hier total unperformant und unangebracht. Ich verstehe nicht, wozu man den braucht.
    Stelle auf VB1963's Vorschlag um!
    #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 :!: