TextChange Event für codegenerierte Textboxen abbonieren

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    TextChange Event für codegenerierte Textboxen abbonieren

    Ich erzeuge per Code eine kleine Menge Textboxen (8 Stück) und füge diese einer ListOf(Controls) hinzu, um später damit arbeiten zu können.
    In diese Textboxen trage ich Einnahmen für Warengruppen ein, hiermit möchte ich den Gesamtumsatz errechnen (Summe aller Warengruppen - also Summe aller codegenerierten Textboxen).
    Dafür möchte ich nun das TextChanged Event meiner Textboxen abbonieren.
    Der Erzeugungscode sieht folgendermaßen aus:

    VB.NET-Quellcode

    1. 'TextBox
    2. Dim newTB = New System.Windows.Forms.TextBox
    3. With newTB
    4. .Location = New System.Drawing.Point(xPosition, yPosition + 23)
    5. .Font = New Font("Microsoft Sans Serif", 12)
    6. .Name = "TB " & GroupName
    7. .Size = New System.Drawing.Size(200, 26)
    8. .TabIndex = 0
    9. .Visible = True
    10. End With
    11. TBList.Add(newTB)
    12. 'Controls auf die Form malen
    13. 'Me.Controls.Add(NewLBL)
    14. Me.Controls.Add(newTB)


    Der Code zum hinzufügen eines Event Handlers müsste ja irgendwie so aussehen:
    AddHandler .TextChanged, AddressOf TextboxName_TextChanged
    Jedoch meckert mein VS hier natürlich, dass " TextboxName_TextChanged" nicht deklariert wurde.
    Wie muss der Code aussehen, um das TextChanged Event zu abbonieren?
    Und der Code Im _TextChanged Event würde für jede Textbox gleich aussehen. Nämlich:

    VB.NET-Quellcode

    1. Private Sub TextChangeEvent()
    2. Dim TotalIncome As Double = 0
    3. Dim Income As Double
    4. For Each TB As Control In TBList 'Schleife durch alle codeerzeugten Textboxen
    5. If Double.TryParse(TB.Text, Income) Then
    6. TotalIncome += Income
    7. tbDailyIncome.Text = TotalIncome.ToString
    8. Else
    9. tbDailyIncome.Text = ""
    10. Exit Sub
    11. End If
    12. Next
    13. End Sub

    Gibt es hier die Möglichkeit nur ein Event für alle Textboxen zu erzeugen, welches eben immer greift, wenn eine der Textboxen geändert wird?
    Hi!

    Oben in Zeile 2 deklarierst Du die neue TextBox lokal..Du musst die Variable für die TextBoxen global deklarieren und mit "WithEvents" versehen!!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private WithEvents newTB As TextBox



    Dieses passiert natürlich außerhalb einer Sub!

    Zudem musst Du dann noch die Zeile mit ​Dim newTB = New System.Windows.Forms.TextBox nach ​newTB = New System.Windows.Forms.TextBox ändern!
    Dann kannst Du AddHandler .TextChanged, AddressOf TextChangeEvent im With-Block setzen!

    DerSmurf schrieb:

    VB.NET-Quellcode

    1. Private Sub TextChangeEvent()
    Die Prozedur hat den falschen Namen und die falsche Signatur.
    Machst Du

    VB.NET-Quellcode

    1. Private Sub TextboxName_TextChanged(sender As Object, e As EventArgs)
    2. Dim tb = DirectCast(sender, TextBox)
    3. 'MessageBox.Show(tb.Text)
    4. Label1.Text = tb.Text
    5. 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!
    Hallo ihr beiden.
    Danke für eure Hilfe. Es klappt nun!
    @Morrison es geht auch ohne die Klassenweite deklaration der Textboxen. Warum rätst du mir dazu?
    Hier mein fertiger Code(ausschnitt):

    VB.NET-Quellcode

    1. 'TextBox
    2. Dim newTB = New System.Windows.Forms.TextBox
    3. With newTB
    4. .Location = New System.Drawing.Point(xPosition, yPosition + 23)
    5. .Font = New Font("Microsoft Sans Serif", 12)
    6. .Name = "TB " & GroupName
    7. .Size = New System.Drawing.Size(200, 26)
    8. .TabIndex = 0
    9. .Visible = True
    10. AddHandler .TextChanged, AddressOf TextChangeEvent
    11. End With
    12. TBList.Add(newTB)

    VB.NET-Quellcode

    1. Private Sub TextChangeEvent(sender As Object, e As EventArgs)
    2. Dim TotalIncome As Double = 0
    3. Dim Income As Double
    4. For Each TB As Control In TBList 'Schleife durch alle codeerzeugten Textboxen
    5. If Double.TryParse(TB.Text, Income) Then
    6. TotalIncome += Income
    7. tbDailyIncome.Text = TotalIncome.ToString
    8. Else
    9. tbDailyIncome.Text = ""
    10. Exit Sub
    11. End If
    12. Next
    13. End Sub
    @DerSmurf Wenn Du die If-Logik im zweiten Snippet rumdrehst, brauchst Du kein Else und der Code ist viel verständlicher.
    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!
    Meinst du so?
    Edit: ich habe noch eine Prüfung eingebaut, ob in der Textbox überhaupt was steht, sonst schlägt double.tryparse ja auch fehl.

    VB.NET-Quellcode

    1. Private Sub TextChangeEvent(sender As Object, e As EventArgs)
    2. Dim TBContent As String = ""
    3. Dim TotalIncome As Double = 0
    4. Dim Income As Double
    5. For Each TB As Control In TBList 'Schleife durch alle codeerzeugten Textboxen
    6. TBContent = TB.Text
    7. If TBContent = "" Then TBContent = 0
    8. If Not Double.TryParse(TBContent, Income) Then
    9. tbDailyIncome.Text = ""
    10. Exit Sub
    11. End If
    12. TotalIncome += Income
    13. tbDailyIncome.Text = TotalIncome.ToString
    14. Next
    15. End Sub
    @DerSmurf Ja.
    Aber:
    Machst Du Option Strict On.
    Visual Studio - Empfohlene Einstellungen
    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!
    Ui. Habe ich in diesem Code tatsächlich vergessen. Genau wie das entfernen des Visual Basic Namespaces.
    Aber auch nach dein Einschalten von Option Strict ON läuft mein Code ohne gemecker.

    Was isn hier falsch - weil ich finde auch nix?

    DerSmurf schrieb:

    Aber auch nach dein Einschalten von Option Strict ON läuft mein Code ohne gemecker.
    :?:
    If TBContent = "" Then TBContent = 0 Entweder TBContent ist ein String oder eine Zahl. Beides geht nicht. Wenn ich Dein Income-Programm auf Strict On stelle, hagelt es Fehler.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nun bin ich verwirrt.
    Wenn ich Option Strict On in den Einstellungen aktiviere: Extras --> Optionen -> Projekte und Projektmappen -> VB-Standart -> Option Strict On . Dann passiert in meinem Projekt garnix.
    Wenn ich Option Strict per Code auf On stelle (also über die Klasse schreibe), hagelt es Fehler :(

    Wo isn hier der Unterschied? Bzw. warum tauchen die Fehler nicht auf, wenn ich über die Einstellungen gehe?
    Du musst im Menü Projekte -> Projekteinstellungen -> Kompilieren: Option "strict" (warum auch immer das jetzt mit Anführungszeichen geschrieben wird) auf on schalten. Was Du gemacht hast, ist: neu zu erstellende Projekte werden mit Option Strict On versehen, aber keine bestehenden.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    DerSmurf schrieb:

    Aber auch nach dein Einschalten von Option Strict ON läuft mein Code ohne gemecker.
    Es gibt 3 Stellen:
    1. Extras -> Optionen -> Projekte und Projektmappen -> VB-Standart -> Option Strict On.
      Das ist für neue Projekte.
    2. Projekt -> Eigenschaften -> Kompilieren
      Das ist für das aktuelle Projekt, wird aus der Einstellung von (1) übernommen, wirkt augenblicklich
    3. in einer Quelldatei ganz oben Option Strict On überschreibt die Einstellung (2), wirkt augenblicklich
      ist z.B. sinnvoll, wenn Code von Strict Off nach Strict On überführt wird.
    Wenn Du Punkt (1) aktivierst, wird jedes neue Projekt mit Strict On erstellt.
    Wenn Du ein altes Projekt öffnest oder Fremd-Projekt importierst, wirkt Einstellung (2), da solltest Du stets nachsehen und On aktivieren.
    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!