Control in mehreren Groupboxes ansprechen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von XBrainBug.

    Control in mehreren Groupboxes ansprechen

    Hallo,

    ​ich habe in mehreren GroupBoxen TextBoxen hinterlegt. Jetzt habe ich ein Datatable wo die Namen und die Groubox hinterlegt sind die zu den TextBoxen gehören. Ich möchte alle TextBoxen mit einer For each Schleife ansprechen. Ich weiß wie ich eine TextBox aus einer bestimmten Groupbox in einer Schleiße anspreche aber wie mache ich das, wenn ich den Namen der Groupbox dynamisch ändern will?

    Hier mal ein Beispiel wie ich mir das ungefähr Vorstelle, das das so nichts wird ist mir klar!

    VB.NET-Quellcode

    1. For Each row In RowS
    2. Dim grpb As String = row("Groupbox")
    3. Dim cntr As TextBox = Me.grpb.Controls(row("name".ToString))
    4. cntr.Text = "1"
    5. Next
    @XBrainBug Das siweht nach einem Design-Fehler aus.
    Wenn das viele TextBoxen sind, nimm ein DataGridView.
    Alternativ pack alle diese TextBoxen in ein separates Array:

    VB.NET-Quellcode

    1. Dim tb() = { TextBox1, TextBox2, TextBox3 }
    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!
    @RodFromGermany
    ​Vielleicht mal eine kurze Erklärung was ich vor habe. Ich will alle Feldinhalte, aus allen TextBoxen, Checkboxen etc. beim Starten einer Form sichern und beim schließen mit den Originalwerten vergleichen. Beim starten schreibe ich alle Werte in eine Tabelle und beim schließen vergleiche ich einfach die Werte wieder. Und ich will den Code wenn ich jetzt noch neue TextBoxen etc. hinzufüge nicht mehr anfassen müssen. Also war meine Idee, einfach eine Schleife über alle Controls und fertig aber jetzt funken mit die GroupBoxes dazwischen, ansonsten läufts schon ohne Probleme.

    ​Ich weiß nicht wie mir da eine DateGridView helfen soll?!

    XBrainBug schrieb:

    ​Ich weiß nicht wie mir da eine DateGridView helfen soll?!
    Ein DGV kann viele Text-Zelen halten, die per DataTable per Einzeiler speicher- und ladbar sind.
    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!
    @RodFromGermany
    Ich glaube wir reden aneinander vorbei. Die Daten zu speichern und wieder zu laden ist nicht das Thema, die stehen alle in einer SQLite Tabelle. Mein Problem besteht darin Zugriff auf die Controls in verschiedenen Groupboxen zu kriegen um sie mit den Werten aus der Tabelle zu vergleichen. Ich will nicht für jede Groupbox eine einzelne Schleife erstellen müssen und ggfs. falls noch neue dazu kommen noch mehr schleifen.
    @XBrainBug Dann pack die TextBoxen oder die GroupBoxen in eine Tabelle, wie oben geschrieben.
    Wo werden denn die Texte editiert?
    Wie sieht denn Deine GUI aus?
    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!
    @RodFromGermany
    Die Form ist dafür da um Werte zum versenden von Mails, hochladen von Daten zu einem SFTP-Server, Archivieren und PDF Erstellung darzustellen. Es geht hier also um viele Werte die ich einzelnen Gruppen zugeordnet habe (GroupBoxen). Die GUI ist nur zum bearbeiten der Werte gedacht und es muss möglichst einfach sein. Theoretisch könnte ich auch einfach alle Werte in eine Tabelle packen und fertig aber es soll halt auch vor Otto normal user schön aussehen....

    Ich habe es aber jetzt gelöst. Anstatt die SQLite Tabelle als Quelle zu nehmen, habe ich einfach die Form genommen. Einfach 2 Schleifen erstellt, je für die Controls in der Form und in den Groupboxen. Jetzt klappts zwar wie gewünscht aber meine eigentliche Frage ist immer noch offen.

    Kann ich bei der angabe:

    VB.NET-Quellcode

    1. Me.GroupBox1.Controls("TextBox1".toString)


    den Wert für den Namen der Groupbox dynamisch einsetzen?
    @XBrainBug So was:

    VB.NET-Quellcode

    1. For Each tb As Button In Me.GroupBox1.Controls.OfType(Of TextBox)()
    2. MessageBox.Show(tb.Text)
    3. 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!
    @RodFromGermany
    Nein, das bezieht sich ja die schleife auf die GroupBox1.
    ​Ich nehme meine Tabelle (Aufbau kommt gleich) und anhand dieser Prüfe ich die Felder in der Form auf Übereinstimmung.

    Eher sowas
    ​Meine Tabelle:
    Name -> Control.Name
    Wert -> Control.Value
    GroupBox -> Die Groupbox die es enthält

    VB.NET-Quellcode

    1. For each Entry in Tabelle
    2. Dim Box as TextBox = Me.Entry("GroupBox").controls(Entry("Name").tostring)
    3. If Entry("Wert")<>Box.text Then
    4. 'Tu irgendwas
    5. End If
    6. ​Next
    @XBrainBug Ich glaub, ich versteh immer weniger. :S
    Vielleicht so was:
    Ein FlowLayoutPanel, statt Deiner GroupBoxen, da kannst Du Controls reinpacken, und die werden dann vom FlowLayoutPanel entsprechend angeordnet.
    Ggf. machst Du Dir ein UserControl: TextBox mt Label, dieses als Beschriftung der TextBox, zum Befüllen des FlowLayoutPanels.
    ====
    Kannst Du mal ein Bild von der GUI posten?
    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!
    @RodFromGermany das denke ich auch ;) , du denkst in eine ganz falsche Richtung.
    Ich erkläre es noch mal anders:
    Ich habe 2 GroupBoxen, mit je 3 Textfeldern. Dazu habe ich eine Tabelle mit 3 Spalten (1. Spalte -> Name Textfeld, 2. Spalte -> Text im Textfeld, 3. Spalte Name der Groupbox die das Textfeld enthält) Beim Porgrammstart wird die Tabelle mit Textfeld.name, Textfeld.text und Groupbox.name gefüllt.
    Das heißt ich habe 6 Zeilen in der Tabelle und über diese mache ich jetzt eine For each Schleife. Dabei würde ich die Schleife so aufbauen wie in meinem Post davor aber das geht ja logischerweise nicht.

    Und das ist das ganze Problem. Beispiel: (Dim Box as TextBox = Me.Groupbox1.controls("TextBox1".ToString)) Ich will den rot markierten Teil im Beispiel durch eine Variable ersetzen, diese befülle ich mit dem wert für Groupbox aus meiner Tabelle aber ich weiß nicht wie oder ob das überhaupt geht!
    @XBrainBug Hatten wir in Post #2, nur nicht Button, sondern GroupBoxen.
    Wenn Du mit Namen arbeiten willst, dsann nimm ein Dictionary(Of String, GroupBox) und pack da Deine GroupBoxen rein:

    VB.NET-Quellcode

    1. Dim dct = New Dictionary(Of String, GroupBox)
    2. dct.Add("Name1", GroupBox1)
    3. dct.Add("Name2", GroupBox2)
    4. dct.Add("Name3", GroupBox3)
    5. ' ...
    6. Dim Box as TextBox = dct("Name2").Controls("TextBox1".ToString))
    (nicht getestet)
    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!
    @RodFromGermany OK ich verstehe was du meinst. Ich habe es mal so umgebaut wie ich es brauche aber wieder habe ich das Problem das er bei der Variable für Groupbox meckert.
    (System.InvalidCastException: "Das Objekt des Typs "System.String" kann nicht in Typ "System.Windows.Forms.GroupBox" umgewandelt werden.)
    Es geht um die Zeile dct.Add(row("name"), row("groupbox"))​ Wenn ich row("groupbox") durch z.B. GroupBox3 ersetze dann geht es. Ich will aber die Groupboxnamen aus der Tabelle lesen.

    VB.NET-Quellcode

    1. Private Sub TestDct()
    2. Dim auswertung As String = ""
    3. GetData("SELECT * FROM aenderungen")
    4. For Each row In table.Rows
    5. If row("groupbox") <> "" Then
    6. Dim dct = New Dictionary(Of String, GroupBox)
    7. dct.Add(row("name"), row("groupbox"))
    8. Dim Box As TextBox = dct(row("name")).Controls(row("name").ToString)
    9. If IsNothing(Box) = False Then auswertung += Box.Text & " | " & Box.Name & vbCrLf
    10. End If
    11. Next
    12. MsgBox(auswertung)
    13. End Sub

    XBrainBug schrieb:

    VB.NET-Quellcode

    1. dct.Add(row("name"), row("groupbox"))
    Was hat das mit dem von mir geposteten Code zu tun?
    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!
    Sry für die späte Reaktion aber hier war wieder die Hölle los...

    RodFromGermany schrieb:

    XBrainBug schrieb:

    VB.NET-Quellcode

    1. dct.Add(row("name"), row("groupbox"))
    Was hat das mit dem von mir geposteten Code zu tun?


    ​Ich weiß nicht wie ich den Code sonst in meine Schleife kriegen soll. Ich bin immer noch Anfänger und versuche soweit es geht mich selbst weiterzubilden...was ja immer nur bedingt gut funktioniert!


    ErfinderDesRades schrieb:

    XBrainBug schrieb:

    Ich will alle Feldinhalte, aus allen TextBoxen, Checkboxen etc. beim Starten einer Form sichern und beim schließen mit den Originalwerten vergleichen.
    Da habich was von Ratiopharm: ComplexConverter: alles in einen String und zurück


    ​Das hört sich interessant an aber ist das nicht etwas zu komplex wenn es nur um die Textfelder und Checkboxen geht?!
    Medine Frage bezog sich auf diese Fehlermeldung:

    XBrainBug schrieb:

    System.InvalidCastException: "Das Objekt des Typs "System.String" kann nicht in Typ "System.Windows.Forms.GroupBox" umgewandelt werden.
    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!

    RodFromGermany schrieb:

    @XBrainBug Hatten wir in Post #2, nur nicht Button, sondern GroupBoxen.
    Wenn Du mit Namen arbeiten willst, dsann nimm ein Dictionary(Of String, GroupBox) und pack da Deine GroupBoxen rein:

    VB.NET-Quellcode

    1. Dim dct = New Dictionary(Of String, GroupBox)
    2. dct.Add("Name1", GroupBox1)
    3. dct.Add("Name2", GroupBox2)
    4. dct.Add("Name3", GroupBox3)
    5. ' ...
    6. Dim Box as TextBox = dct("Name2").Controls("TextBox1".ToString))
    (nicht getestet)


    Das war die Lösung, hatte es zu Anfang nur nicht richtig verstanden...Danke!