StackOverflowException ohne Rekursion oder Endlosschleife?

Hintergrund

Ich habe eine DataGridView Steuern, welche ich benutze, und ich habe meine hf unten, um die DataGridView.CellFormatting Veranstaltung, so dass die Werte in einigen Zellen kann mehr lesbar sind. Dieser event-handler funktioniert bestens, Formatierung alle Werte ohne Problem.

Kürzlich habe ich jedoch entdeckt, eine sehr seltene Umstand führt zu einem ungewöhnlichen bug. Die Spalte in meiner DataGridView für das Element der Fälligkeit hat immer ein int Wert. 0 weist das Ereignis niemals durch, jeder andere Wert ist ein UTC-Zeitstempel für die Fälligkeit. Der MySQL-db entsprechende Spalte nicht null-Werte zulassen. Wenn sich der Benutzer bewegt hat, von einem DataGridView Zeile mit einem Fälligkeitsdatum, einem anderen DataGridView Zeile mit einem Fälligkeitsdatum (an diesem Punkt ist alles scheint noch in Ordnung), und dann eine Taste drückt, die lädt die Daten aus der Datenbank (ohne senden von Aktualisierungen, die im wesentlichen den Aufruf DataAdapter.Fill()), wird das Programm generiert ein StackOverflowException**.

Keine Rekursion?

Was ist so ungewöhnlich für mich ist, dass ich nicht sehen, wo die Rekursion oder infinte Schleife ist. Ich fügte int cellFormatCallCount als in der Klasse, und erhöhen Sie bei jedem Anruf, aber zu der Zeit die Ausnahme geworfen wird, wird der debugger zeigt den Wert der int als 1, was ich erwarten würde, da ich nicht unter dem Eindruck und die Rekursion wurde anspringt.

Kann mir jemand helfen?

Wie kann ich einen stack-trace? In VS2008 es sagt:
{Cannot evaluate expression because the current thread is in a stack overflow state.}

Beste Grüße,

Robinson

private int cellFormatCallCount = 0;
private void myDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)  {
    try {
        //to format the cell, we will need to know its value and which column its in
        string value = "";
        string column = "";

        //the event is sometimes called where the value property is null
        if (e.Value != null) {
            cellFormatCallCount++; //here is my test for recursion, this class member will increment each call

            //This is the line that throws the StackOverflowException
            /* ********************* */
            value = e.Value.ToString();
            /* ********************* */

            column = actionsDataGridView.Columns[e.ColumnIndex].Name;
        } else {
            return; //null values cannont be formatted, so return
        }

        if (column == "id") {
            //different code for formatting each column
        } else if (column == "title") {
            //...
        } else {
            //...
        }
    } finally {
        cellFormatCallCount = 0; //after we are done with the formatting, reset our recursion counter
    }
}
  • Kannst du die stack-trace? Das würde helfen, eine Menge.
  • Ich dachte, dieser thread wurde über diese website. Boy, ich brauche eine Pause =p
  • Ich auch! Ich versuchte herauszufinden, wie er eine Ausnahme von der website. Sheesh!
  • Wenn Sie einen Haltepunkt in die betreffende Zeile, kann der Schritt in die Eigenschaft Zugang von e.Wert? Sie können Quickview e.Wert? Wenn ja, was sehen Sie?
  • Es ist eine lange gedreht, aber was ist in e.Wert? Wenn die ToString-Methode auf, die definiert ist rekursiv, dann könnte man einen stackoverflow. Ja, es klingt verrückt, aber es ist einfacher als Sie vielleicht denken, vor allem, wenn Sie ein Objekt mit einer Eigenschaft, die Ihnen erlaubt, ein "set" mit dem Typ Object, die vielleicht nur zufällig enthalten sich.
  • Wenn Sie brechen direkt vor der ToString-call-und put-e.Wert.ToString() in der watch-Fenster, verursacht stackoverflow aus dem debugger?
  • Würde versuchen CStr(e.Wert) irgendwelche Hinweise?
  • Sie akzeptiert die Antwort, Pflege lassen Sie uns wissen, was war passiert?

InformationsquelleAutor gnirts | 2009-04-22
Schreibe einen Kommentar