My.Settings.save viele viele Textboxen

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

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von mox.

    My.Settings.save viele viele Textboxen

    Hallo Spezialisten,

    ich stehe mal wieder vor einer grundsätzlichen Frage. Ich erstelle eine neue Anwendung die in einer Form ca. 32 Container hat. in diesen Containern sind mehrere Textboxen auszufüllen, ca. 5 Stück plus 1 Checkbox Item.
    Ich möchte die Eingaben darin speichern. Das ganze habe ich jetzt für den 1. Container mal via My.Settings gemacht. Wenn ich mir allerdings vorstelle dass ich dies in den Einstellungen zum Speichern für alle 32 Container und alle darin enthaltenen Textboxen machen soll, dann stellt sich mir die Frage ob es nicht einen Sinnvolleren Weg gibt die Inhalte zu speichern.

    Ich hoffe Ihr versteht was ich meine. Ich muss einfach unglaublich viele Parameter eingeben um diese dann My.Settings.save zuweisen zu können.

    Evtl. habt Ihr einen Tipp für mich der mir das ganze vereinfachen kann. z.B.: den ganzen Inhalt der einzelnen Container speichern oder so. Da müsste ich das nur 32x machen was ja noch ginge.

    Gruß Kay
    Du kannst die Controls ja gleich an die Settings binden - das machst du halt einmal (32x6 mal) beim mit dem Formsdesigner...
    Bei so vielen Controls sollte man sich ein Usercontrol erzeugen und das dazu verwenden...

    Kaypetri schrieb:

    um diese dann My.Settings.save zuweisen zu können
    was meinst du damit?
    Ich lege ja bei den Projekteigenschaften -> Einstellungen jetzt für jede Textbox einzeln den Speicherslot an. Diesen weise ich nun der Textbox zu.

    Visual Basic-Quellcode

    1. ​My.Settings.Team1 = TB_T1_Name.Text 'TB ist Textbox
    2. My.Settings.GruppeT1 = G_T1.Text 'G ist Textbox
    3. My.Settings.Save()
    4. My.Settings.Reload()


    Über diese Art und Weise müsste ich ja jetzt alle Textboxen erstellen. Das ist ein ziemlicher Aufwand.
    hi, was @VB1963 meint ist, das du die Textbox in den Designer Einstellungen direkt an die entsprechenden Settings Binden kannst. Guck mal in der Einstellung der TextBox unter Application Settings ganz oben.

    dann kannst Du noch in den Projekt Einstellungen den Haken setzen bei "My Settings beim herunterfahren speichern" und feddisch...
    "Hier könnte Ihre Werbung stehen..."
    Ok. Das schaue ich mir auch mal an. Ich habe es jetzt gerade so gemacht:

    Visual Basic-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. My.Settings.Settings = TB_NAME_T1.Text & ";" & RTB_DRIVER_T1.Text & ";" & LB_T1.Text & ";" & TB_K1_T1.Text & ";" & TB_K2_T1.Text & ";" & TB_K3_T1.Text
    3. My.Settings.checked_T1 = CB_T1.CheckState
    4. My.Settings.Save()
    5. My.Settings.Reload()
    6. End Sub
    7. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    8. Dim v As Array = Split(My.Settings.Settings, ";")
    9. TB_NAME_T1.Text = v(0)
    10. RTB_DRIVER_T1.Text = v(1)
    11. LB_T1.Text = v(2)
    12. TB_K1_T1.Text = v(3)
    13. TB_K2_T1.Text = v(4)
    14. TB_K3_T1.Text = v(5)
    15. CB_T1.Checked = My.Settings.checked_T1
    16. End Sub


    Vorteil so finde ich ist, dass ich 1ne Variante einfach runter code und dann nur noch diese Zeile kopiere 32x halt und die Zahlen aktualisiere. Das sende ich dann in ein String Array das ich trenne und dann wieder auffange. Der einzige Vorteil darin ist wie gesagt die Möglichkeit des kopieren.
    Im Moment befinden sich alle Eingaben für ein Team in einem Panel. Cool wäre jetzt wenn ich das Panel einfach kopieren könnte (32x) und die Namen der Textboxen bestehen bleiben. Das dies nicht geht ist logisch, aber gibt es evtl. eine Möglichkeit dass er einfach am Ende gleich eine weitere Zahl anhängt? Sonst muss ich ja jede Textbox vom namen her neu benennen obwohl sich die namen nur in der Zahl ändern. Sinnvollerweise bräuchte ich nur die Standardbenennung also TextBox1 usw. benutzen, aber da fehlt mir irgendwie die Übersicht was wo liegt und was was ist.
    ich sag ja: mehr Code und mehr Code-Arbeit.

    Aber guggemol mein Tut - da wird ja zB ein Treeview komplett durchlaufen, oder auch eine Listview wird durchlaufen, und halt alle Element-Daten gespeichert/rekonfiguriert.

    So Durchlauf-Schleifen kann man auch mit Textboxen machen - die Namen der Textboxen sind da nicht mehr relevant.



    Oder du schwenkst halt um auf das, was du scheints tatsäclich vorliegen hast: nämlich eine Datenverarbeitung.
    Da hat man mit einem typisierten Dataset ja ganz andere Möglichkeiten von Laden, speichern, Databinding etc.

    Und welcher User will denn ein Form angucken mit 30 Panels drauf mit je 5 Textboxen und 1 Checkbox?
    Da wäre vmtl. malwieder ein DetailView viel günstiger, oder wenn mans garnet lassen kann mit den vielen Containern, kann man sich ein DataRepeater konfigurieren.
    Auf jedenfall mit Databinding an ein typDataset arbeiten - nicht so viel inne Controls rumpfuschen.

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

    Den ComplexConverter-Code im Einzelnen zu verstehen ist allerdings ziemlich advanced - aber das braucht man nicht, um ihn zu benutzen.

    Zunächstmal muss es dir nur gelingen, einen einzigen TextboxText zu persistieren.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _Memory As New ComplexConverter
    3. Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    4. ' My.Settings.Memory ist in den Anwendungseinstellungen eingerichtet
    5. _Memory.ApplyDataString(My.Settings.Memory)
    6. End Sub
    7. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    8. My.Settings.Memory = _Memory.CreateDataString()
    9. End Sub
    10. Private Sub _Memory_Convert(ByVal sender As Object, ByVal e As ComplexConverter.EventArg) Handles _Memory.Convert
    11. e.ConvertValue(Textbox1.Text)
    12. End Sub
    13. End Class
    Dazu musst du überhaupt mal die ComplexConverter-Klasse in dein Projekt kopieren - kriegste das hin?
    Das wäre dann der Durchbruch, die Schleife zum Durchnudeln aller Textboxen ist dann nur noch eine Erweiterung.
    Ok. Jetzt bin ich Heim und habe Deine Möglichkeit soweit mal ausprobiert. Wie nicht anders zu erwarten war funktioniert dies natürlich tadellos. Aber wie ich schon sagte bin ich kein VB Spezialist und frage mich nun wie ich denn die Textboxes zum Beispiel in die For Each Schleife bekomme. Da bin ich ehrlich gesagt überfordert wie man sowas umsetzt. Ich habe versucht es analog zu Deinem Listviews zu machen, aber komme da im Textbox Bereich so nicht weiter weil er Inhalte der Textbox nicht behandeln kann. Oder ich mache es total falsch.
    jetzt kommt es auf den Aufbau deines Forms an. Man kann die Container durchschleifen, und innerhalb der Container die Textboxen durchschleifen.
    Funktioniert aber nur, wenn die Container auffm Form aufsitzen.
    Hast du sie auch wieder in einen Container gesetzt (etwa in einen SplitContainer), dann muss man natürlich dessen Inhalt durchschleifen.

    So in die Richtung:

    VB.NET-Quellcode

    1. Private Sub _Memory_Convert(ByVal sender As Object, ByVal e As ComplexConverter.EventArg) Handles _Memory.Convert
    2. For Each Container In Me.Controls.OfType(Of ScrollableControl)()
    3. For Each txtBx In Container.Controls.OfType(Of TextBox)()
    4. e.ConvertValue(txtBx.Text)
    5. Next
    6. Next
    7. End Sub

    Ja. Ich habe die Textboxes immer in Panels. Das mache ich deswegen so, weil sich bei aktivierten Check Item die Hintergrundfarbe dieses Panels ändern muss. So wie Du es jetzt schreibst ist es für mich auch nachvollziehbar. Warum komme ich nur nicht darauf das so zu machen. Da zeigt sich ganz klar wie viel Routine man benötig.

    Also wirklich super. Das funktioniert genau so wie ich es brauche. Danke für deinen Super Code. Der erspart mir viel coden. Big thx

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

    @Kaypetri Mal ein Hinweis aus der Praxis: sehr viele Settings an Controls gebunden dauern beim Update der GUI sehr sehr lange.
    Da rate ich Dir in jedem Falle zu einer selbst gemachten Lösung.
    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!
    naja, die ComplexConverter nutzt ja nur ein einziges Setting. Kann natürlich ebensogut aus einer Datei gelesen sein, aber glaub nicht, dasses davon schneller wird.
    Aber um sowas soll man sich erst Gedanken machen, wenns wirklich als problematisch auftritt: the 3 rules of Optimization.

    Eher problematisch finde ich, dass hier wohl eine Datenverarbeitung vorliegt, aber das Instrumentarium, was .Net dafür bereit stellt, nicht genutzt wird.
    Nein. Es geht nicht wirklich um eine Datenverarbeitung. Es geht eigentlich um was das ich nur 1x im Jahr brauche. Ich veranstalte 1x im Jahr ein Kartrennen und das ist dermaßen gewachsen dass es jetzt 100 Fahrer mit 32 Teams sind. Ich möchte einfach recht simpel Teamnamen und die ausgelosten Karts und Gruppe eingeben können und diese dann im Jeder gegen Jeder Modus darstellen. Am Ende meiner Eingabe, soll auf Form2 also nur noch stehen in Gruppe A fahren Team 1-x mit der oder der Kartnummer.Einfach damit das Chaos dann aufhört weil die Leute vergessen wo Sie starten müssen. Da bin ich auch gleich beim nächsten Problem.

    Ich habe nun für jedes Team die Combobox zur Auswahl der gelosten Gruppe also A,B,C oder Gruppe D.
    Es ergeben sich daraus natürlich 32 Comboboxen. Deren Abfrage wollte ich jetzt recht simpel einfach mit hochzählen. Wie kann ich denn den Namen der Combobox auf einer anderen Form variabel gestalten. Den String dazu könnte ich zusammensetzen, aber bei der IF Abfrage kann dieser nicht als Combobox verarbeitet werden.

    Es gibt mich Sicherheit eine deutlich bessere Lösung dafür, aber ich muss eben im Rahmen meiner Möglichkeiten bleiben.

    Also kurz um:

    Visual Basic-Quellcode

    1. ​If Form1.ComboBox1.Text = "A" Then
    2. XXX
    3. End IF
    4. If Form1.ComboBox2.Text = "A" Then
    5. XXX
    6. End IF


    Ich möchte also die Hochzählung 1 bzw. 2 automatisieren und diese Combos ansprechen.

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

    Kaypetri schrieb:

    100 Fahrer mit 32 Teams sind. Ich möchte einfach recht simpel Teamnamen und die ausgelosten Karts und Gruppe
    Na, wenn das keine Datenverarbeitung ist, ...!!

    Ich tät sagen, wenn das mit Datenverarbeitungs-Instrumentarium ausserhalb deiner Möglichkeiten ist, dann ist es ohne Datenverarbeitungs-Instrumentarium erst recht ausserhalb deiner Möglichkeiten.

    Weil das Datenverarbeitungs-Instrumentarium ist eine Hilfe, derlei Problemstellungen überhaupt in den Griff zu bekommen.

    Kaypetri schrieb:

    VB.NET-Quellcode

    1. If Form1.ComboBox1.Text = "A" Then
    Du verwendest da die implizite Ranz-VB6-Kompatibilitäts-Instanz, da wirst Du sehr bald an deren Grenzen stoßen.
    Arbeite mit expliziten .NET-Instanzen. 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!