Nicht nachvollziehbarer Stackoverflow

  • WPF

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Translating-IT.

    Nicht nachvollziehbarer Stackoverflow

    Hi,

    Ich habe ein WPF-Formular mit mehreren Textboxen und Radiobuttons.

    Nun ist mir aufgefallen, dass bei einem bestimmten Radion und einer Textbox ein Stackoverflow auftritt, wenn die Reihenfolge nicht stimmt. Woran kann das liegen?


    Textbox definiert den zu suchenden Text (TB2)

    RBs definieren ob direkt ersetzt werden oder die Treffer angezeigt werden sollen. Hier geht es um den RB für anzeigen. (RB4)


    Wird zuerst der RB ausgewählt und dann Text eingegeben, läuft beim Abschicken alles wie es soll. Gibt der Benutzer aber zuerst den Text ein und wählt dann erst den Radio aus, endet das jedes Mal in einem Stackoverflow.

    Definition in XAML:

    VB.NET-Quellcode

    1. <TextBox x:Name="TB1" HorizontalAlignment="Left" Height="23" Margin="183,11,0,0" TextWrapping="Wrap" Text="Suchtext für Ausgangstext" LostKeyboardFocus="TextBox_LostKeyboardFocus" GotKeyboardFocus="TextBox_GotKeyboardFocus" KeyUp="TextBox_KeyUp" VerticalAlignment="Top" Width="341" Visibility="visible"/>
    2. <TextBox x:Name="TB2" HorizontalAlignment="Left" Height="23" Margin="183,46,0,0" TextWrapping="Wrap" Text="Suchtext für Zieltext" LostKeyboardFocus="TextBox_LostKeyboardFocus" GotKeyboardFocus="TextBox_GotKeyboardFocus" KeyUp="TextBox_KeyUp" VerticalAlignment="Top" Width="342" Visibility="visible"/>
    3. <TextBox x:Name="TB3" HorizontalAlignment="Left" Height="23" Margin="894,46,0,0" TextWrapping="Wrap" Text="Ersetzen durch" LostKeyboardFocus="TextBox_LostKeyboardFocus" GotKeyboardFocus="TextBox_GotKeyboardFocus" KeyUp="TextBox_KeyUp" VerticalAlignment="Top" Width="342" Visibility="visible"/>
    4. <RadioButton x:Name="RB1" Content="Ausgangstext" GroupName="1" HorizontalAlignment="Left" Margin="790,34,0,0" VerticalAlignment="Top" Visibility="visible"/>
    5. <RadioButton x:Name="RB2" Content="Zieltext" GroupName="1" HorizontalAlignment="Left" Margin="790,54,0,0" VerticalAlignment="Top" Visibility="visible"/>
    6. <RadioButton x:Name="RB3" Content="Text automatisch ersetzen" GroupName="2" HorizontalAlignment="Left" Margin="10,8,0,0" VerticalAlignment="Top"/>
    7. <RadioButton x:Name="RB4" Content="Segmente suchen" GroupName="2" HorizontalAlignment="Left" Margin="10,30,0,0" VerticalAlignment="Top"/>


    LG,

    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    sorry, den Teil hatte ich vergessen:

    VB.NET-Quellcode

    1. Private Sub TB4_TextChanged(sender As Object, e As TextChangedEventArgs) Handles TB4.TextChanged
    2. If Not IsNumeric(TB4.Text) Then
    3. int_seite = 1
    4. Else
    5. int_seite = TB4.Text
    6. End If
    7. If int_seite <= 1 Then
    8. int_seite = 1
    9. TB4.Text = int_seite 'FEHLER TRITT HIER bei int_seite AUF int_seite ist aber korrekt auf 1 gesetzt
    10. DG1.ItemsSource = oc.Skip(0).Take(int_take)
    11. End If
    12. If int_seite >= int_max Then
    13. int_seite = int_max
    14. TB4.Text = int_seite
    15. DG1.ItemsSource = oc.Skip((int_max * int_take) - int_take).Take(int_take)
    16. End If
    17. DG1.ItemsSource = oc.Skip((int_seite - 1) * int_take).Take(int_take)
    18. End Sub


    Obwohl es gerade jener Teil ist, der das Ganze so unverständlich macht. (siehe Kommentar im Code)

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Ich würde erstmal die ganzen Schlampereien beseitigen indem im Option Strict On (einfach in Zeile 1 hin schreiben) verwende... kleiner, gut gemeinter, Tipp meinerseits.
    "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

    mrMo schrieb:

    Nicht nachvollziehbarer Stackoverflow[/url]']Ich würde erstmal die ganzen Schlampereien beseitigen indem im Option Strict On (einfach in Zeile 1 hin schreiben) verwende... kleiner, gut gemeinter, Tipp meinerseits.


    was aber leider überhautp nichts am Problem ändert. Der Fehler tritt auch mit Option Strict On auf.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Naja, und der VB6-Namespace ist auch drin. Und das in Kombination mit der modernen WPF. Egal.
    Das Problem liegt in den Zeilen#8-#10:

    VB.NET-Quellcode

    1. If int_seite <= 1 Then
    2. int_seite = 1
    3. TB4.Text = int_seite

    Wenn int_seite <=1 ist, wird es zu 1 und dann TB4.Text zugeordnet. Das führt dazu, dass das TextChanged-Ereignis gefeuert wird. Und da der gezeigte Code ein Teil des TextChanged-EventHandlers ist, kommt es hier zu einer Endlosschleife -> StackOverflow
    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.
    Hi,

    VaporiZed schrieb:

    Naja, und der VB6-Namespace ist auch drin. Und das in Kombination mit der modernen WPF. Egal.
    Das Problem liegt in den Zeilen#8-#10:
    VB.NET-Quellcode (3 Zeilen)
    Wenn int_seite &lt;=1 ist, wird es zu 1 und dann TB4.Text zugeordnet. Das führt dazu, dass das…


    int_seite < 1 ändert auch nichts am Stapelüberlauf. Wobei sich dann auch die Frage stellt, warum er nur ausgelöst wird, wenn die oben genannte Reihenfolge der Elemente "falsch" ist.

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Translating-IT“ ()

    Hallo @Translating-IT

    Lese nochmals das von @VaporiZed

    VaporiZed schrieb:

    Das führt dazu, dass das TextChanged-Ereignis gefeuert wird. Und da der gezeigte Code ein Teil des TextChanged-EventHandlers ist, kommt es hier zu einer Endlosschleife -> StackOverflow

    Also vorher mit RemoveHandler und danach wieder mit AddHander diesen Abonnieren da ja sonst eine Endlosschleife entsteht.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Es stellt sich dann aber auch die Frage, welche Auswirkungen die RadioButtons codetechnisch haben. Denn das ist ja immer noch nicht zu sehen. Wenn es den Code von TB4.TextChanged beeinflusst, sollten wir auch erfahren, wo im CodeBehind die Werte der RadioButtons ausgewertet werden. Mein erster Erklärungsversuch ist nicht ausreichend, das sehe ich ein. Aber es fehlen offensichtlich alle relevanten Informationen. Im XAML-Code kann ich als WPF-Novize keine Auswirkungen der BadioButtons auf den Programmablauf erkennnen. TB4 wird im XAML-Block gar nicht erwähnt. Und was sich hinter den Ereignissen der anderen TextBoxen verbirgt, wissen wir nicht. Will jemand einen Spekulatius?
    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.
    Das Grundproblem ist erstmal das hier nicht mit Binding gearbeitet wird. Habe ich Binding mit einer Klasse würden sich die ganzen Fragen erst gar nicht stellen. Dann würde man übersichtlich sofort sehen was hier wo passiert.
    Das @Translating-IT lässt sich hier nur schwer belehren, das hatte ich bereits versucht.
    Wenn ich ein Bindingsystem zur Verfügung habe verwende ich es doch auch. Aber es kann gut sein das es Gründe gibt es nicht zu Verwenden.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hi,

    Das mit dem RemoveHandler und AddHandler habe ich jetzt am Abend erst nachschauen können.

    Irgendwie scheine ich die aber falsch (an den falschen Stellen) zu setzen, vorausgesetzt, ich verwende sie überhaupt richtig:

    VB.NET-Quellcode

    1. RemoveHandler TB4.TextChanged, AddressOf TB4_TextChanged
    2. AddHandler TB4.TextChanged, AddressOf TB4_TextChanged


    Oder muss ich die anders schreiben? Je nachdem wo ich diese einsetze, passiert in der Anwendung gar nichts mehr, d.h. es werden keine Ergebnisse angezeigt. Oder ich erhalte wieder den Stapelüberlauf.


    welche Auswirkungen die RadioButtons codetechnisch haben. Denn das ist ja immer noch nicht zu sehen. Wenn es den Code von TB4.TextChanged beeinflusst, sollten wir auch erfahren, wo im CodeBehind die Werte der RadioButtons ausgewertet werden


    Stimmt, sorry, hatte übersehen, dass TB4 fehlt:

    VB.NET-Quellcode

    1. <TextBox x:Name="TB4" Grid.Column="3" HorizontalAlignment="right" Height="23" Margin="0,0,90,0" BorderThickness="1" TextAlignment="Center" Text="{Binding int_seite, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="50" Visibility="visible" Grid.ColumnSpan="2" />


    TB4 zeigt nur die Seitenzahl der Ergebnisse an und soll auch vom Kunden verändert werden können. Format: 1 / x

    Die RBs stellen Weichen im Code dar (wie es auch im XAML bei den entsprechenden Elementen als Text bzw. Content definiert ist.

    - Soll der Code für direktes Ändern der Daten ausgelöst werden (RB3)?
    - Sollen die Ergebnisse erst angezeigt werden, um sie dann händisch zu ändern (RB4)?

    dazu jeweils die Optionen: Nur im Ausgangstext suchen (RB1) und nur im Zieltext suchen (RB2). (Und bin grad drauf gekommen, dass noch eine dazu programmiert werden muss: suchen, wenn in Ausgangs- und Zieltext die entsprechenden Suchbegriffe für Ausgangs- und Zieltext vorkommen.)

    Die TBs:
    - TB1 Suchtext für Ausgangstext
    - TB2 Suchtext für Zieltext
    - TB3 gilt nur, wenn RB4 gewählt ist. Dann wir der gesuchte Text automatisch mit dem aus TB3 ersetzt.


    Aber ich verstehe nicht, wieso eine andere Reihenfolge beim Ausfüllen bzw. Auswählen einen Stapelüberlauf verursacht, das Ergebnis und vor allem die Reihenfolge der Codeausführung für die Weiche sind punktgenau gleich:

    erst schauen, welcher RB ausgewählt ist und dann in der angehängten Datei die Suchtexte anwenden.

    Und beide landen daher in genau dem gleichen Codeabschnitt.

    OK, ich könnte es mir einfach machen und den TBs erst anzeigen, wenn die RBs angewählt sind, damit die Reihenfolge keine Probleme verursacht, aber ich möchte den Fehler ausmerzen und auch verstehen, wieso er überhaupt auftritt.

    @Sascha
    Ich habe die Bindings noch nicht überall umgesetzt, da ich darauf zum Teil noch vergesse. Bin von jahrelangem asp.net noch ganz anders gewohnt.


    Falls es noch Fragen gibt, einfach melden. Ich versuche noch etwas mit dem add und remove rumzuspielen und zu lesen, auch wenn heute schon bald wieder Schicht ist. :(

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Translating-IT“ ()