Visual Studio --> WPF --> Textbox --> Textbox_TextChanged = stürzt ab!

  • WPF

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von mikeb69.

    Visual Studio --> WPF --> Textbox --> Textbox_TextChanged = stürzt ab!

    Hallo Zusammen

    Ich will neu meine Programme mit WPF erstellen und habe schon am Start Schwierigkeiten.

    Folgender Code funktioniert mit Windows Forms aber mit WPF stürzt Visual Studio ab.

    VB.NET-Quellcode

    1. Private Sub Apparatekosten_TextChanged(sender As Object, e As TextChangedEventArgs) Handles Apparatekosten.TextChanged
    2. TotalApparate.Text = "Test"
    3. End Sub
    4. Private Sub GKApparate_TextChanged(sender As Object, e As TextChangedEventArgs) Handles GKApparate.TextChanged
    5. TotalApparate.Text = "Test"
    6. End Sub
    7. Private Sub Materialkosten_TextChanged(sender As Object, e As TextChangedEventArgs) Handles Materialkosten.TextChanged
    8. TotalMaterial.Text = "Test"
    9. End Sub
    10. Private Sub GKMaterial_TextChanged(sender As Object, e As TextChangedEventArgs) Handles GKMaterial.TextChanged
    11. TotalMaterial.Text = "Test"
    12. End Sub


    Ich verstehe nicht was das Problem ist?
    Ich hatte auch schon folgenden Fehler angezeigt bekommen:

    System.NullReferenceException: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    Wer kann mir weiterhelfen?
    Mehr Code bitte. NullReferenceException tritt auf, wenn was Null (Nothing in VB) ist und Du davon was "rausholen" willst (z.B. mit dem Punkt-Operator, Array-Indexierung und ein paar andere Fälle). In diesem Fall bedeutet das dann wohl, dass TotalMaterial bzw. TotalApparate Null ist. Aber hier sieht man nicht, woher die kommen -> Mehr Code bitte.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Guten Morgen

    Das ist der ganze Code.

    Wenn ich noch mit den Textboxen rechnen will kommt der oben erwähnte Fehler

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private Sub Apparatekosten_TextChanged(sender As Object, e As TextChangedEventArgs) Handles Apparatekosten.TextChanged
    3. TotalApparate.Text = (Convert.ToInt16(Apparatekosten.Text) * Convert.ToInt16(GKApparate.Text)).ToString
    4. End Sub
    5. Private Sub GKApparate_TextChanged(sender As Object, e As TextChangedEventArgs) Handles GKApparate.TextChanged
    6. TotalApparate.Text = (Convert.ToInt16(Apparatekosten.Text) * Convert.ToInt16(GKApparate.Text)).ToString
    7. End Sub
    8. Private Sub Materialkosten_TextChanged(sender As Object, e As TextChangedEventArgs) Handles Materialkosten.TextChanged
    9. TotalApparate.Text = (Convert.ToInt16(Apparatekosten.Text) * Convert.ToInt16(GKApparate.Text)).ToString
    10. End Sub
    11. Private Sub GKMaterial_TextChanged(sender As Object, e As TextChangedEventArgs) Handles GKMaterial.TextChanged
    12. TotalApparate.Text = (Convert.ToInt16(Apparatekosten.Text) * Convert.ToInt16(GKApparate.Text)).ToString
    13. End Sub
    14. Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
    15. End Sub
    16. End Class​


    und keine der Textboxen ist leer.
    @dejanstar: Das liegt daran, dass zu Programmstart die TextBoxen doch leer sind. Du hast wahrscheinlich nen Text im Designer bei den TextBoxen eingetragen. Und diesen Text will Dein Programm zum Programmstart nun einbauen. Das führt leider dazu, dass die TextChanged-Ereignisse aufgerufen werden. Und da dort noch nix drinsteht, wird Mus draus. Mir fallen auf Anhieb zwei Möglichkeiten ein:

    1. Du verwendest nicht in den Methodenköpfen ) Handles ... Apparatekosten.TextChanged etc., sondern nutzt dynamische Ereignis-Handler:

    VB.NET-Quellcode

    1. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    2. AddHandler Apparatekosten.TextChanged, AddressOf Apparatekosten_TextChanged
    3. AddHandler GKApparate.TextChanged, AddressOf GKApparate_TextChanged
    4. End Sub

    oder
    2. (unschön, aber billig): Du deklarierst eine(n?) Klassenflag, z.B. Dim FullyLoaded = False, gibst jeder Deiner TextChanged-Methode noch als 1. Zeile ein If Not FullyLoaded Then Exit Sub mit und packst in die o.g. Private Sub MainWindow_Loaded noch ein FullyLoaded = True rein.

    @Niko Ortner: Im Code wird nix weiter sein. Der Rest wurde über den WPF-Designer gemacht. Sind wohl nur benannte TextBoxen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― Eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    ― If Not GrammarIsOk() Then AssumeThatCodeIsOk = False
    ― »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder – wenn es kein Besteck mehr gibt – zumindest Glasnudeln.«
    Man ersetze die Textboxen durch NumericUpDown Controls und braucht nix zu Convertieren, keine EventHandler erzeugen und muss auch keine FullyLoaded Variablen nutzen...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @VaporiZed: Einfach genial, jetzt funktioniert es, ich dachte ich bringe es nicht hin. Danke
    mit der zweiten unschönen Variante funktioniert es auch.
    Ich hatte mir auch so etwas gedacht und habe versucht mit einer if Abfrage eine leere Textbox auszuschließen

    VB.NET-Quellcode

    1. ​If TextBox.Text = "" Then
    2. mache nichts
    3. Else
    4. rechnen
    5. End If

    wieso geht das nicht und wieso gibt es das Problem bei Windows Forms nicht?

    Freundliche Grüsse

    dejanstar schrieb:

    wieso geht das nicht und wieso gibt es das Problem bei Windows Forms nicht?
    Eine Exception wird auch in WinForms auftreten, wenn du bei der ApperateTextbox die Text-Eigenschaft auf "abc" setzt...

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

    @dejanstar,

    würde dir dringend empfehlen die in #8 empfohlenen Bindings einzusetzen.

    Ist am Anfang vielleicht etwas anstrengend sich da einzuarbeiten. Es lohnt sich aber.
    Einfach alle Win Forms vorgehensweisen vergessen und neu beginnen.

    Im Sourcecode Austausch hab ich Stichworte(Tags) Liste aus einem heraus Text erstellen erstellt. Dort lade ich heute abend den Projektordner hoch, ist WPF mit MVVM. Vielleicht hilft dir das ein wenig für das Verständnis.

    Stichwort MVVM

    Gruß