DataGridView-Ausnahme

  • VB.NET
  • .NET 5–6

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    DataGridView-Ausnahme

    Grüßt euch,

    ich habe ein kleines Programm geschrieben (Dataset Only) und habe jetzt ein Problem:

    Es gibt Auftragspositionen und um die Summe einer Auftragsposition zu berechnen gibt es Unterpositionen (Unter-Tabelle "Massenberechnung"), aus denen sich diese zusammensetzt. Somit gibt es ein Datagridview mit Auftragspositionen und ein untergeordnetes Datagridview "Massenberechnungen", welches bei Klick auf eine Auftragsposition die dazugehörigen Berechnungen anzeigt.
    Das funktioniert auch wunderbar -> Bzw. hat wunderbar funktioniert. Jetzt bekomme ich beim Speichern eines untergeordneten Datensatzes den Fehler (siehe Anhang). Und ich kann mir leider nicht erklären woher der kommt.

    Eine Spalte namens 'key' habe ich nicht.

    Die Spalten AuftragspositionsID und ID habe ich zu Debug-Zwecken eingeblendet: Dort ist auf jedenfall keien Spalte NULL o.ä.
    Das meiner Meinung nach kuriose ist, dass es zuvor funktioniert hat und jetzt nicht mehr...
    Es gibt von der Tabelle Auftragspositionen noch weitere Untertabellen -> Dort funktioniert das Anlegen von Datensätzen wunderbar. Ich sehe keinen Unterschied zu meiner Massenberechnungs Tabelle...

    Könnt ihr mir da weiterhelfen?

    Danke und viele Grüße
    Philipp


    Edit: Interessanter Weise habe ich die gleiche Relation in einem anderen Formular und dort funktioniert sie so wie sie soll. Ich finde echt keinen Unterschied. Vielleicht kann mir ja jemand den richtigen Hinweis geben. Danke!
    Bilder
    • fehler.png

      54,89 kB, 886×421, 70 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Philipp“ ()

    Philipp schrieb:

    Eine Spalte namens 'key' habe ich nicht.
    Hast Du ein Dictionary(Of x, y)?
    Das wäre dann ggf. ein invalides KeyValuePair(Of x, y).
    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!
    @Philipp Bereinige das Projekt (ohne die bin, obj und vs-Verzeichnisse), zippe es und hänge es an (Erweiterte Antwort => Dateianhänge => Hochladen).
    Der @ErfinderDesRades wird sicher ein Auge drauf werfen.
    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!
    Es ist wirklich nervtötend.

    Ich habe jetzt herausgefunden, dass der Fehler weg ist wenn ich folgenden Code auskommentiere:

    VB.NET-Quellcode

    1. Private Sub TblRechenschritteBindingSource_ListChanged(sender As Object, e As EventArgs) Handles TblRechenschritteBindingSource.ListChanged
    2. If Not IsNothing(TblRechenschritteBindingSource.Current) Then
    3. Dim rw As DtsMassenermittlung.TblRechenschritteRow = DirectCast(DirectCast(TblRechenschritteBindingSource.Current, DataRowView).Row, DtsMassenermittlung.TblRechenschritteRow)
    4. rw.Ergebnis = ClsParser.TryParseCommand(rw.Rechnung)
    5. End If
    6. End Sub


    Wobei die angesprochene Funktion so aussieht:

    VB.NET-Quellcode

    1. Public Shared Function TryParseCommand(ByVal command As String) As Double
    2. If IsNothing(command) Then Return 0
    3. command = command.Replace(",", ".")
    4. Dim value As Double
    5. Dim MyProvider As New VBCodeProvider ' Create a new VB Code Compiler
    6. #Disable Warning IDE0017 ' Initialisierung von Objekten vereinfachen
    7. Dim cp As New CompilerParameters ' Create a new Compiler parameter object.
    8. #Enable Warning IDE0017 ' Initialisierung von Objekten vereinfachen
    9. cp.GenerateExecutable = False ' Don't create an object on disk
    10. cp.GenerateInMemory = True ' But do create one in memory.
    11. 'If cp.OutputAssembly is used with a VBCodeProvider, it seems to want to read before it is executed.
    12. 'See C# CodeBank example for explanation of why it was used.
    13. ' the below is an empty VB.NET Project with a function that simply returns the value of our command parameter.
    14. Dim TempModuleSource As String = "Imports System" & Environment.NewLine &
    15. "Namespace ns " & Environment.NewLine &
    16. "Public Class class1" & Environment.NewLine &
    17. "Public Shared Function Evaluate()" & Environment.NewLine &
    18. "Return " & command & Environment.NewLine &
    19. "End Function" & Environment.NewLine &
    20. "End Class" & Environment.NewLine &
    21. "End Namespace"
    22. ' Create a compiler output results object and compile the source code.
    23. Dim cr As CompilerResults = MyProvider.CompileAssemblyFromSource(cp, TempModuleSource)
    24. If cr.Errors.Count > 0 Then
    25. 'If the expression passed is invalid or "", the compiler will generate errors.
    26. Return 0
    27. End If
    28. 'Find our Evaluate method.
    29. Dim methInfo As MethodInfo = cr.CompiledAssembly.GetType("ns.class1").GetMethod("Evaluate")
    30. 'Invoke it on nothing, so that we can get the return value
    31. value = Math.Round(Convert.ToDouble(methInfo.Invoke(Nothing, Nothing)), 3)
    32. Return value
    33. End Function


    Bringt mich ehrlichgesagt aber bei der Fehlersuche nicht richtig weiter. Die genannte Funktion soll aufgrund der Eingabe in einer Dataset-Spalte eine andere berechnen. Das hat so schon funktioniert und an anderer Stelle funktioniert es auch noch nach wie vor wie es soll...
    Seht ihr da was?



    Ich habe den fehler nun (scheinbar) behoben:

    Folgende Zeile habe ich geändert

    VB.NET-Quellcode

    1. Private Sub TblRechenschritteBindingSource_ListChanged(sender As Object, e As EventArgs) Handles TblRechenschritteBindingSource.ListChanged

    in

    VB.NET-Quellcode

    1. Private Sub TblRechenschritteBindingSource_ListChanged(sender As Object, e As EventArgs) Handles TblRechenschritteDataGridView.CellEndEdit


    Beiträge zusammengefügt. ~Thunderbolt

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

    Naja, der Vorgang wird eine Exception werfen.
    Datagridview fängt dummerweise Exceptions, die während seiner Darstellung auftreten, und meldet sie durch diese blöde Messagebox.
    Ich mach in letzter Zeit gute Erfahrungen mit den 'ExceptionSettings'.
    Unter Menü Debug.Windows.ExceptionSettings kann man 'Common Language Runtime Exceptions' festlegen, sodass der Debugger erstmal bei allen Excceptions anhält, auch wenn sie gecatcht werden.
    So kriegst du eine vernünftige Fehlermeldung - hoffe ich.

    Edit: Interessanter Workaround - hat das was mit der ZufügeZeile des DGV zu tun ?
    Ich kann es nicht genau sagen, das Debugging ist an der Stelle wirklich gemein... "eigentlich" sollte es an dieser Stelle keine Probleme geben, da ja alles Typisiert ist...
    Auch auf den Workaround zu kommen war nicht grade einfach, die Exception wird ja gar nicht an der Stelle geworfen an der sie auftritt. So ein Mist, das hat mich jetzt so viele Stunden gekostet...
    Wenn sowas auftaucht, mach ich das, was mir die Standardmessage sagt: Ich geh in den DataError-EventHandler und schau in e nach, welcher Tabelleneintrag da gerade Probleme macht. Und dann such ich an der Stelle weiter. ListChanged kann ja bedeuten, dass in einem Berechnungszwischenschritt was fehlt, was gebraucht wird.
    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.
    @Philipp Welchen Wert (Beispiel) übergibst du denn an diese TryParseCommand Methode? Finde die sehr interessant…
    "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
    Vollzitat eines Vorposts durch Anredefunktion ersetzt ~VaporiZed
    @ErfinderDesRades:

    Habe ich noch nicht, da ich erstmal weiterkomme und schon sehr viel Zeit da reingesteckt habe. Aber ist auf jedenfall dann der Ansatz wenn es wieder in der Richtung Probleme gibt...
    Ich habe grade mal geschaut, ich finde das Menü bzw. den Menüpunkt den du meinst nicht?!


    @mrMo Die TryParseCommand Methode wird mit einem "Rechenweg" gefüttert und liefert das Ergebnis dieser Rechnung. Der übergebene String könnte also zum Beispiel so aussehen: "5" oder "5+5" oder "(5*3) /2". Die Methode habe ich mir allerdings auch "nur" ergoogelt und an meine Bedürfnisse angepasst.

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

    Find ich bissl arg übertrieben die Methode…

    Wenn du magst: Schau mal ob docs.microsoft.com/de-de/dotne…em.data.datatable.compute für deine Anforderungen ausreicht. Oder aber auch das MSScript Control (schlecht dokumentiert, musst mal googlen) wäre geeignet.
    "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