Mehrere TextBoxen in Anhängigkeit - Numerisch prüfen lassen

  • VB.NET

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

    Mehrere TextBoxen in Anhängigkeit - Numerisch prüfen lassen

    Hallo mal wieder und allen "Frohe Weihnachten".

    ich schlage mich mit einem lästigen Thema herum und finde im VB.Net keine schöne Lösung.
    Zum Thema: Ich bastel eine von mir erstellte Excel-VBA Datei nun ins VB.Net. (Im Excel VBA habe ich mein Problem gelöst, indem ich Worksheet Change benutzt habe).

    Problembeschreibung:
    Ich möchte Fehleingaben verhindern!
    1) Einzelne TextBoxen: Dynamische Anzahl TextBoxen müssen "positive, ganze Zahlen" sein.
    2) Doppelte TextBoxen: beide TB wie 1), aber zusätzlich muss die rechte TB um eins größer sein.
    Beispiel: Links steht eine 4, dann sollte rechts eine 5 eingetragen werden.
    Gegenbeispiel: Wenn rechts eine 3 eingetragen wird, dann muss sich die linke TB eine 2 bekommen (Wechselwirkung)

    Grundaufbau:
    Es gibt ein Panel, worin ich untereinander mehrere GroupBoxen gepackt habe.
    Die sich darin befindenden Labels und TextBoxen werden zur Laufzeit erzeugt und können beliebig viele sein.
    In die einzelnen TextBoxen mit der Überschrift "Anzahl" darf der User nur positive ganze Zahlen eintragen. Alles andere soll ignoriert werden. (C&P sollte erlaubt sein).
    Bei den doppelten TextBoxen ist das genauso, allerdings haben die eine Wechselwirkung.
    Egal in welches Feld man etwas einträgt, das zugehörige soll automatisch ausgefüllt werden. In diesem Fall soll die linke TB immer eins kleiner sein, wie die rechte TB.
    Wenn aber manuell beide ausgefüllt werden, so muss die linke kleiner bleiben, aber es darf auch ein größerer Wertunterschied werden (z.B. links 4 zu rechts 14).

    Genug davon. Schaut Euch bitte mal meinen beigefügten Screenshot an, dann wird es verständlich. THX !



    Mein abgespeckter Code sieht so aus:

    Quellcode

    1. Private Sub frmBaukosten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim i As Integer
    3. Dim IntZeilenPosition As Integer
    4. Dim IntGrpBoxHight As Integer
    5. Dim IntTabIndex As Integer
    6. ' XML-Datei einlesen lassen
    7. Call dataset_BAD()
    8. Call dataset_style()
    9. Me.BackColor = Color.FromName(ds_style.Tables("Form").Rows(0).Item("BackColor"))
    10. IntGrpBoxHight = 0
    11. IntZeilenPosition = 40
    12. For i = 0 To ds.Tables("Flotte").Rows.Count - 1
    13. ' Label Schiffs-Typ erstellen
    14. lbl_Flotte = New Label
    15. With lbl_Flotte
    16. .Name = "lbl_Flotte" & i
    17. .Left = 15
    18. .Top = IntZeilenPosition
    19. .BackColor = Color.FromName(ds_style.Tables("StyleLabel").Rows(0).Item("BackColor"))
    20. .Size = New System.Drawing.Size(150, 20)
    21. .Text = ds.Tables("Flotte").Rows(i).Item("Typ")
    22. .TextAlign = ContentAlignment.MiddleLeft
    23. .BorderStyle = BorderStyle.FixedSingle
    24. Me.GrpBoxFlotte.Controls.Add(lbl_Flotte)
    25. End With
    26. ' TextBoxen "Anzahl" für die Schiffs-Typ erstellen
    27. txt_Flotte = New TextBox
    28. With txt_Flotte
    29. .Name = "txt_Flotte" & i
    30. .Left = 170
    31. .Top = IntZeilenPosition
    32. .TabIndex = IntTabIndex
    33. .BackColor = Color.FromName(ds_style.Tables("StyleTextBox").Rows(0).Item("BackColor"))
    34. .Size = New System.Drawing.Size(75, 20)
    35. .TextAlign = HorizontalAlignment.Right
    36. .BorderStyle = BorderStyle.FixedSingle
    37. Me.GrpBoxFlotte.Controls.Add(txt_Flotte)
    38. End With
    39. ' usw, usw
    40. End Sub


    Ihr seht also, dass meine TextBoxen einen eindeutigen Namen besitzen, der hinten hochgezählt wird und in diesem Falle in der GrouBox "GrpBoxFlotte" ist.

    Zur Information: Mein bisheriger Code mag gefallen oder nicht, aber die Datei arbeitet so wie sie soll.
    Mir fehlt jetzt nur noch obiges Thema, um die Datei Userfreundlich zu haben.

    Um die Wechselwirkung der beiden nebeneinanderstehenden TB zu behandeln hatte ich in Excel folgende Formel:

    Quellcode

    1. 'aktuelle Stufe überwachen
    2. If Not Intersect(Target, rngAktStufe) Is Nothing Then
    3. For Each rng In Intersect(Target, rngAktStufe).Cells
    4. If Not IsNumeric(rng) Then
    5. rng.Value = ""
    6. rng.Offset(0, 1) = ""
    7. ElseIf rng > 0 And rng.Offset(0, 1) <= rng Then
    8. rng.Offset(0, 1).Value = rng.Value + 1
    9. ElseIf rng = 0 And rng.Offset(0, 1) >= 1 Then
    10. 'mach nix
    11. ElseIf rng = 0 Then
    12. rng.Offset(0, 1) = 1
    13. End If
    14. Next rng
    15. End If
    16. 'Zielstufe überwachen
    17. If Not Intersect(Target, rngZielStufe) Is Nothing Then
    18. For Each rng In Intersect(Target, rngZielStufe).Cells
    19. If Not IsNumeric(rng) Then
    20. rng.Value = ""
    21. rng.Offset(0, -1) = ""
    22. ElseIf rng < 1 Then
    23. rng.Value = ""
    24. rng.Offset(0, -1) = ""
    25. ElseIf rng >= 1 And rng.Offset(0, -1) >= rng Then
    26. rng.Offset(0, -1).Value = rng.Value - 1
    27. ElseIf rng = 1 Then
    28. rng.Offset(0, -1) = 0
    29. End If
    30. Next rng
    31. End If


    Nur, wie bekomme ich alle TextBoxänderungen überwacht? Ein Globales "Irgendetwas TextChanged" finde ich nicht.
    und folgendes ist als Idee zwar ein Anfang, aber nur für feste Anzahlen von TB geeignet.

    Quellcode

    1. Private Sub TextBox_KeyUp(ByVal sender As Object, ByVal e As _ System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp, _ TextBox2.KeyUp, TextBox3.KeyUp


    Ich würde mich freuen, wenn sich jmd findet, der mir aus diesem Dilemma hilft ^^
    Mir ist schon klar, dass die Lösung vermutlich extrem einfach sein wird. Aber das ist es halt immer, wenn man sie kennt.

    In diesem Sinne schonmal: DANKE !
    DragonRE

    DragonRE schrieb:

    TextBoxen einen eindeutigen Namen besitzen,

    Ich hoffe ich habe alles richtig gelesen und verstanden.

    Wenn deine TextBoxen eindeutige Namen haben, dann fragst du im Event ab.
    Wie groß ist der Wert, dann vergleichst du ihn mit der anderen TextBox.
    ggf den Wert korregieren oder den Curser in der TextBox festhalten, bis der User den richtigen Wert eingegeben hat.

    - hierfür eignen sich folgende Events
    - TextChanged
    - Validating / Validated
    - Enter

    Das vergleichen und abgleichen belkommst du alleine hin. das sehe ich an deinem Code.

    Sollte ich es falsch verstanden haben, dann sorry


    Bernd
    Hallo Bernd,
    erst einmal Danke für Deine Bemühungen. Ich weiß, dass ich dazu neige etwas ausschweifend zu erklären und dabei den eigendlichen Punkt verwässer^^

    Wie ich auf numerisch Prüfe, bzw. die anderen Bedingungen erzeuge ist mir absolut klar. Soweit richtig.

    Ich kreise um das Thema: Wie überwache ich zur Laufzeit alle TextBoxen?

    Bei einer einzelnen wäre es mir klar (Ein Beispiel):

    Quellcode

    1. Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    2. Select Case Asc(e.KeyChar)
    3. Case 48 To 57, 8, 32
    4. ' Zahlen, Backspace und Space zulassen
    5. Case Else
    6. ' alle anderen Eingaben unterdrücken
    7. e.Handled = True
    8. End Select
    9. End Sub



    Nun habe ich allerdings keine Ahnung wieviele TextBoxen bei Aufruf der Form erzeugt werden.
    Somit kann ich ja nicht einfach wild 200 dieser Sub´s auf Verdacht erzeugen^^

    Wie kann ich das bitte umsetzen?

    Im Excel-VBA ging das einfach über Worksheet Change! Wenn sich dann irgendetwas im Tabellenblatt verändert hat, dann lief meine Prozedur an.

    Hier gäbe es ein Panel-Change, Form-Chance usw .... Was auch alles bestimmt gebraucht wird.
    Aber darüber kann ich nicht all meine TextBoxen überwachen. Die reagieren soweit ich das sehe nur bei einer direkten Änderung in demselbigen.

    Hoffe, dass mein Punkt nun etwas klarer herüberkommt.

    Schonmal Danke für weitere Tipps und Lösungsansätze.

    DragonRE
    Dann entwickel eine Logik die auf alle TextBoxen greift.

    Der Wert der linken TextBox darf nicht größer als der Wert der rechten TextBox sein.

    Dann liegt es ein wenig an der Nummerierung deiner TextBoxen.

    Ich stelle mir eine Lösung ungefähr so vor.
    Beim Klicken auf Button Berechnen

    Ausgehend davon das Linke TextBox eine ungerade Zahl als Bezeichner besitzt

    For Each Control As Control
    If Type of Control Is TextBox Then
    if TextBox.Name Contains ungerade Zahl Then
    ... Wert holen und korregieren wenn nötig, korrektur an TextBox1 + 1 weitergeben
    Else
    ... Wert holen und korregieren wenn nötig, korrektur an TextBox1 - 1 weitergeben.
    End If
    End If
    Next

    oder den Curser einfach in der TextBox festhalten in der ein falsche Wert steht

    naja ich und meine Erklärungen
    ah jetzt ja...
    Ich verstehe worauf du hinaus möchtest !
    Ok, das wäre im Notfall auch ein Weg.

    Schöner fände ich es, wenn direkt bei einer Eingabe, (wo der User gedanklich sowie mit dem Auge dort ist) die Eingabe überwacht würde.
    Also ohne drücken eines Buttons.

    Der User schreibt in eine TextBox einen Buchstaben, hoppla, da schreibt ja nix .... Genauer hinschauen und man trägt die gewünschte Zahl ein.

    Das TextBox1_KeyPress, oder TextChange muss doch auch irgendwie für zig TextBoxen benutzt werden können,
    um dann auf die Eingabe reagieren zu können.

    VB.NET-Quellcode

    1. Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    2. Handles TextBox3.TextChanged, TextBox1.TextChanged, TextBox2.TextChanged
    3. ' hier dein Code
    4. End Sub


    Du kannst die Handels alle dahinter packen. Also werden auch die Events von allen TextBoxen aus ausgelöst.
    Nun liegt es daran wie du es programmiertechnisch gestalltest, da du ja die TextBoxen via Code erzeugst.

    Edit:
    damit du nicht lange suchen musst

    VB.NET-Quellcode

    1. ' Remove an existing event-handler, if present
    2. RemoveHandler combo.SelectedIndexChanged, _
    3. New EventHandler(AddressOf ComboBox_SelectedIndexChanged)
    4. ' Add the event handler.
    5. AddHandler combo.SelectedIndexChanged, _
    6. New EventHandler(AddressOf ComboBox_SelectedIndexChanged)

    Also mit AddHandler kannst du der TextBox das zuweisen

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

    Hallo Bernd,
    vielen Dank, dass Du Dir soviel Mühe mit meinem Thema gibst.

    Ich habe das Gefühl "Jetzt bist Du bei mir"
    Schau Dir bitte kurz meine letzte CodeBox im Ursprungspost an, mit den beiden Zeilen als Bemerkung dabei.
    Mehr oder weniger exakt Dein letztes Posting *gg*

    Die Frage aller Fragen lautet: Wie bekommt man es hin, diese hintereinander aufgereihten TB1.TextChanged ... 2.3.4.5.6. .....
    dynamisch zu erweitern?

    Bei Programmaufruf wird ja erst die Anzahl der TextBoxen festgelegt.
    Ergo müsste das Ende der Zeile "Sub ..." dann mal als letzte TextBox Nr 8 sein, beim nächsten Aufruf TextBox Nr 218.

    Ich sehe diese Art nur als Realistisch an, wenn man eine fest definierte Anzahl von TextBoxen besitzt.

    Oder renne ich da mangels Wissen total in die falschen Gehirnwindungen ?

    LG,
    DragonRE
    Was dir vorschwebt nennt man Validierung. Dafür gibts fabelhafte Unterstützung in winForms, die ungültige Eingaben markiert, und ausserdem den Focus im Control mit der Fehleingabe festhält.
    Wasses nicht leistet, ist, die einzelnen Tastendrücke einer Fehleingabe zu unterdrücken oder zu verbessern. Validierung geht standardmäßig so, dass man eine Fehleingabe schon machen muß.
    gugge Control.Validating + ErrorProvider

    Für dein Unterdrückungs-Feature musste eine ziemlich listige Methode schreiben, die alle Eingabefelder berücksichtigt, und da herum-korrigiert.
    Und diese Methode muß im SelectionChanged jeder mitspielenden Textbox aufgerufen werden.
    Außerdem mußt du Ereignisketten verhindern, nämlich wenn eine Korrektur gemacht wird, löst das ja wieder ein SelectionChanged aus, wodurch deine Korrektur-Methode ja erneut aufgerufen wird.
    Siehe dazu das richtextbox-Demo in Alles über Events
    Dort wird auch bisserl was zu AddHandler gesagt, was du für deine Frage aller Fragen brauchst.
    Mal Konkret als Beispiel wie ich das so meine, weil ich halt nicht so gut im erklären bin.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim MeinButton As New Button
    4. With MeinButton
    5. ' ab hier können sämtliche Eigenschaften des Steuerelements (In dem Fall Button) geändert werden.
    6. .Text = "Klick Mich Mal" ' Text
    7. .BringToFront() ' Im Vordegrund starten
    8. .ForeColor = Color.Black 'TextFarbe
    9. .Width = 150 ' Breite
    10. .Height = 40 ' Höhe
    11. .Left = 100 ' Abstand vom linken Rand
    12. .Top = 100 ' Abstand vom oberen Rand
    13. ' Man kann noch viel mehr Eigenschaften ändern Einfach mal ausprobiren
    14. AddHandler .Click, AddressOf ButtonKlick ' Mit AddHandler weist ihr das Event einem Handler zu
    15. ' um später darauf zugreifen zu können ( Hier zb. ClickEvent )
    16. Me.Controls.Add(MeinButton) ' Me Controlls.Add bringt den Butten auf die Form
    17. End With
    18. End Sub
    19. ' Hier kommt das rein was beim ButtoklickEvent passieren soll, in dem Fall MsgBox
    20. Private Sub ButtonKlick(ByVal sender As System.Object, ByVal e As System.EventArgs)
    21. MessageBox.Show("Klick")
    22. End Sub
    23. End Class
    Sieh Dir mal folgende relativ einfache Logik an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub TextBox1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) _
    2. Handles TextBox1.KeyDown, TextBox2.KeyDown, TextBox3.KeyDown, TextBox4.KeyDown, TextBox5.KeyDown, TextBox6.KeyDown
    3. Select Case e.KeyCode
    4. Case Keys.D0 To Keys.D9
    5. Case Keys.Back
    6. Case Keys.Space
    7. Case Else
    8. e.SuppressKeyPress = True
    9. Return
    10. End Select
    11. If sender Is TextBox1 Then
    12. ' was tun
    13. ElseIf sender Is TextBox2 Then
    14. ' was tun
    15. ElseIf sender Is TextBox3 Then
    16. ' was tun
    17. ElseIf sender Is TextBox4 Then
    18. ' was tun
    19. ElseIf sender Is TextBox5 Then
    20. ' was tun
    21. ElseIf sender Is TextBox6 Then
    22. ' was tun
    23. End If
    24. 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!

    DragonRE schrieb:

    Gegenbeispiel: Wenn rechts eine 3 eingetragen wird, dann muss sich die linke TB eine 2 bekommen (Wechselwirkung)
    [...]
    Wenn aber manuell beide ausgefüllt werden, so muss die linke kleiner bleiben, aber es darf auch ein größerer Wertunterschied werden (z.B. links 4 zu rechts 14).

    Wie soll das definiert werden?
    T1 <> T2
    Eintrag in T1: 3
    Automatisch T2: 2
    Eintrag in T2: 5
    T1? Bleibt auf 3 oder wird zu 6?
    Hallo zusammen,
    erst einmal vielen Dank für all die Anregungen !

    @ErfinderDesRades:
    Das mit der Validierung kannte ich bisher nicht, bzw. habe es noch nie eingesetzt.
    Auf den ersten Blick sieht es so aus, als ob es Codeseitig die kürzeste Variante wäre.
    Allerdings habe ich mir bisher auch nur das Beispiel Deiner Verlinkten Seite angeschaut.
    Welche Fallstricke noch auf mich warten wird sich ergeben^^
    Auf jeden Fall werde ich mich dort ein wenig einarbeiten und es mir näher anschauen.


    @Bernd:
    AddHandler scheint genau das zu sein, wonach ich gesucht hatte.
    Zumindest für die einzeln stehenden TextBoxen verhält es sich nun exakt so wie geplant und gewünscht.
    Allerdings bekomme ich keine Information "Welche TextBox aktuell geändert wird".
    Ich erhalte als Information bisher ausschließlich die Nummer "0" bei egal welcher TextBox ...
    Werde noch ein wenig Google quälen müssen bis es bei mir wirklich "Klick" gemacht hat und ich verstehe was ich da mache.

    Ein Auszug meines Codes:

    Funktioniert: Einzelne TextBox die nur auf Numerisch geprüft werden soll.

    Quellcode

    1. Private Sub TBoxNrOnly(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    2. Select Case Asc(e.KeyChar)
    3. Case 48 To 57, 8
    4. ' Zahlen und Backspace zulassen
    5. Case Else
    6. ' alle anderen Eingaben unterdrücken
    7. e.Handled = True
    8. End Select
    9. End Sub
    10. Private Sub frmBaukosten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    11. Dim i As Integer
    12. For i = 0 To ds.Tables("Flotte").Rows.Count - 1
    13. txt_Flotte = New TextBox
    14. AddHandler txt_Flotte.KeyPress, AddressOf TBoxNrOnly
    15. With txt_Flotte
    16. .Name = "txt_Flotte" & i
    17. .Left = 170
    18. .Top = IntZeilenPosition
    19. .TabIndex = IntTabIndex
    20. .BackColor = Color.FromName(ds_style.Tables("StyleTextBox").Rows(0).Item("BackColor"))
    21. .Size = New System.Drawing.Size(75, 20)
    22. .TextAlign = HorizontalAlignment.Right
    23. .BorderStyle = BorderStyle.FixedSingle
    24. Me.GrpBoxFlotte.Controls.Add(txt_Flotte)
    25. End With
    26. '...



    FAIL: 2 TextBoxen jeweils in Abhängigkeit (Ich komme nicht an den Namen der aktuellen TextBox heran. Diese werden am Ende durchnummeriert. Es darf also auch gerne ein Counter sein ... AddHandler 1 bis n)

    Quellcode

    1. Private Sub TBoxAktuellZiel(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    2. MsgBox(txt_Versorgung_Aktuell.Name)
    3. MsgBox(CType(sender, TextBox).Name)
    4. End Sub


    Leider viel Try&Error beim Versuch an einen TextBox.Name zu kommen^^

    Ich werde jetzt noch ein wenig stöbern und Morgen/Übermorgen erst einmal ein wenig renovieren.
    Schaue dann wieder vorbei und meinen aktuellen Stand durchgeben.

    Vielen Dank für Eure Unterstützung und Gedult !

    DragonRE


    vb-paradise.de/user/11507-erfinderdesrades/
    Ein "Frohes Neues" an alle freiwilligen Helferlein hier im Forum.

    Meine Renovierung ist erledigt. Hat wie immer ein klein wenig länger gedauert als erwartet ; )
    Aber zwischendurch habe ich mir immer mal ein paar Minuten Zeit genommen, um mein Projekt vorran zu bringen.

    @Bernd:
    Vielen lieben Dank für Deine Gedult und Deine Hilfe.

    Auch wenn es elend lange gedauert hat, nun läuft alles bei der Eingabe in meinen TextBoxen wie gewünscht.
    Das allerbeste dabei: Ich habe einiges gelernt und mir ist die Bedeutung der Händler klar geworden.
    Aus einem Try&Error ist ein gezielter Einsatz derselben geworden^^

    @ErfinderdesRades:
    Auch die ErrorProvider und die Validierung habe ich mir inzwischen näher angeschaut.
    In diesem speziellen Fall werde ich sie zwar nicht einsetzen, aber in meinem direkten Folgeprojekt (Welches hierzu gehört) werde ich damit arbeiten.
    Eine nette Erklärung zu den ErrorProvidern habe ich zusätzlich noch gefunden:
    vbarchiv.net/tipps/tipp_950-ei…rorprovider-abfangen.html


    @all die ein ähnliches Problem haben und eine Lösung suchen:
    Zur Abfrage ob gerade eine Zahl eingetippt wurde eignet sich "TextBox_Keypress"

    Wenn man allerdings wie ich zusätzlich den Wert 2er TextBoxen miteinander vergleichen möchte, dann benötigt man "TextBox_Leave".
    Beim Verlassen der TextBox wurde die eingetippte Zahl schon berücksichtigt und man kann den neuen Wert der TextBox direkt abfragen (VOR verlassen der TextBox).

    Somit ergeben sich in diesem Fall 2 Addhandler. Der erste Fragt ab, ob die aktuell getippte Taste eine Zahl ist
    und der 2te Handler verarbeitet dann die beiden Werte der TextBoxen.

    Code gekürzt und nur zur Veranschaulichung:

    Quellcode

    1. Private Sub txtNrOnly(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    2. ' Nur Zahlen zulassen
    3. Select Case Asc(e.KeyChar)
    4. Case 48 To 57, 8
    5. ' Zahlen (48-57) und Backspace (8) zulassen. Space (32)
    6. Case Else
    7. ' alle anderen Eingaben unterdrücken
    8. e.Handled = True
    9. End Select
    10. End Sub
    11. Private Sub txt_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
    12. Dim txtTBWert As TextBox
    13. 'Herausfinden wie die aktuelle TB heißt und welchen Wert sie hat
    14. txtTBWert = DirectCast(sender, TextBox)
    15. MsgBox(txtTBWert.Name & ": " & txtTBWert.Text)
    16. ' Dies nur der vollständigkeit halber, damit Ihr direkt wisst, wie Ihr an die entsprechenden Werte kommt.
    17. ' Welche Abhängigkeiten Ihr einbringt, müsst Ihr selbst entscheiden.
    18. End Sub
    19. Private Sub frmBaukosten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    20. ' und so würde man dann die beiden Addhandler an die TextBoxen bringen.
    21. For i = 1 To 30
    22. txt_Versorgung_Aktuell = New TextBox
    23. With txt_Versorgung_Aktuell
    24. .Name = "txt_Versorgung_Aktuell" & i
    25. .Left = 170
    26. .Top = IntZeilenPosition
    27. .TabIndex = IntTabIndex
    28. .BackColor = Color.Beige
    29. .Size = New System.Drawing.Size(75, 20)
    30. .TextAlign = HorizontalAlignment.Right
    31. .BorderStyle = BorderStyle.FixedSingle
    32. AddHandler .KeyPress, AddressOf txtNrOnly
    33. AddHandler .Leave, AddressOf txt_Leave
    34. Me.GrpBoxVersorgung.Controls.Add(txt_Versorgung_Aktuell)
    35. End With
    36. txt_Versorgung_Ziel = New TextBox
    37. With txt_Versorgung_Ziel
    38. .Name = "txt_Versorgung_Ziel" & i
    39. .Left = 244
    40. .Top = IntZeilenPosition
    41. .TabIndex = IntTabIndex
    42. .BackColor = Color.Beige
    43. .Size = New System.Drawing.Size(75, 20)
    44. .TextAlign = HorizontalAlignment.Right
    45. .BorderStyle = BorderStyle.FixedSingle
    46. AddHandler .KeyPress, AddressOf txtNrOnly
    47. AddHandler .Leave, AddressOf txt_Leave
    48. Me.GrpBoxVersorgung.Controls.Add(txt_Versorgung_Ziel)
    49. End With
    50. Next
    51. End Sub


    Somit ist mein Thema gelöst und funktioniert wie gewünscht !
    Besten Dank an alle, die sich hier beteiligt haben.
    Mein besonderer Dank gilt Bernd, ohne den ich wohl kaum zu einer Lösung gekommen wäre (oder zumindest mit viel mehr Zeitaufwand und Frust^^).

    THX a lot !!
    DragonRE