[WPF/DataGrid] Tausende Exceptions werden geworfen, aber es funktioniert?



  • Guten Abend

    Ich bin nun sehr viel weiter mit meiner Applikation und es werden alle Daten in meinen Grids (DataGrid, .NET 4.0) angezeigt, die ich will. Ich habe beliebige Datenbank-Tabellen, aus deren Schema ich dynamisch Klassen erzeuge. Diese Klassen befülle ich dann mit den Daten und erzeuge daraus Listen, welche mir als ItemsSource dienen (direktes Binding auf eine DataTable ist keine Option).

    Im Debug-Modus habe ich jedoch festgestellt, dass ich bei der Anzeige extrem viele Exceptions bekomme, die jedoch nicht behandelt werden müssen/können. Mein Programm läuft einfach weiter, ist aber extrem langsam. Die Exceptions treten für alle Datenbank-Felder auf, welche nicht in den dynamischen Klassen direkt in System.String umgewandelt werden, beispielsweise System.Guid oder System.DateTime . Die Exceptions sehen in etwa so aus:

    Debugger schrieb:

    System.Windows.Data Error: 17 : Cannot get 'ChangedOn' value (type 'DateTime') from '' (type 'Class_with_tag_c00c09a4_777f_4df0_a1f1_bd954f33de6a'). BindingExpression:Path=ChangedOn; DataItem='Class_with_tag_c00c09a4_777f_4df0_a1f1_bd954f33de6a' (HashCode=28703446); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String') TargetInvocationException:'System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidCastException: Specified cast is not valid.
       at Jit.Class_with_tag_c00c09a4_777f_4df0_a1f1_bd954f33de6a.get_ChangedOn()
       --- End of inner exception stack trace ---
       at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
       at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
       at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
       at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
       at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
       at MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level)
       at MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'
    

    Meine Fragen lauten wie folgt:

    • Was bedeuten diese Exceptions und wieso treten diese auf?
    • Warum läuft meine Applikation dennoch weiter?
    • Wie behebe ich dieses 'Problem'?

    Besten Dank für jegliche Tipps

    MfG


  • Administrator

    /rant/ schrieb:

    Was bedeuten diese Exceptions und wieso treten diese auf?

    Scheint als könne aus den übergebenen Daten keine Strings erzeugt werden. Wahrscheinlich musst du da bei den Bindings noch Konverter mitliefern.

    /rant/ schrieb:

    Warum läuft meine Applikation dennoch weiter?

    WPF verschluckt alle Exceptions und macht dann nur ein DebugOut.

    /rant/ schrieb:

    Wie behebe ich dieses 'Problem'?

    Wie gesagt, übergebe den Binding noch entsprechende Konverter:
    http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

    Das ist zumindest meine Vermutung.

    Grüssli



  • Danke, du hast mir gezeigt wo ich suchen muss. Ich habe bereits einen Konverter, der mit allem, was ich gerade brauchen sollte umgehen können. Zumindest habe ich das gedacht, bis ich gesehen habe, dass der Fehler nur dann auftritt, wenn in der Datenbank auf nullable-Columns nichts eingetragen ist. Das soll heissen, wenn statt DateTime sowas wie DBNull rauskommt.

    Meine Casts werden zur Laufzeit in den Klassen mittels Reflection implementiert; ich habe die DBNull nicht gesehen. Nun schaut man in der MSDN:

    http://msdn.microsoft.com/en-us/library/system.dbnull.aspx schrieb:

    Explicit Interface Implementations

    • IConvertible.ToDateTime: Infrastructure. This conversion is not supported. Attempting to make this conversion throws an InvalidCastException.

    Zu dumm nur, dass das in der Exception nicht ersichtlich wird. 😞

    Vielen Dank 👍


Anmelden zum Antworten