Bindingsource.Find erkennt Parameter nicht und schmeißt ArgumentException

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Marsianer.

    Bindingsource.Find erkennt Parameter nicht und schmeißt ArgumentException

    N'Abend,

    ich hab schon ganz schartige Zähne vom In-den-Tisch-beißen :cursing:

    Folgendes Problem:
    Haupttabelle "Buchungen" wird in einer Form angezeigt/geändert usw. Detailtabellen zu der Haupttabelle werden in derselben Form in DataGridViews mitgeführt. Das ganze ist mit einem typisierten DataSet realisiert, die Verbindung läuft über BindingSources (DataMember ist dann natürlich die Relation zwischen "Buchungen" und der jeweiligen Detailtabelle). Soweit, so gut.
    Es kann aber vorkommen, dass durch Änderungen an den Werten einer Buchung ganze Datensätze in der Detailtabelle nicht mehr gültig sind und gelöscht werden müssen (hängt damit zusammen, zu welchen Terminen eine Buchung ausgeführt werden soll... wenn ich diese Termine ändere, können Detaildatensätze "verwaisen"). Da das nix mit Löschweitergabe und so zu tun hat, sondern nur von der Geschäftslogik abhängig ist, habe ich mir eine Funktion geschrieben, die vor dem Speichern der Buchungen nach solchen verwaisten Datensätzen sucht. Auch das funktioniert prima und ich bekomme eine Löschliste als ListOfInteger, die die ID's der zu löschenden Datensätze enthält und die ich abarbeiten kann.

    So nu muss ich eigentlich nur noch diese Datensätze löschen. Und daran ruiniere ich mir das Gebiss :pinch:
    Zuerst wollte ich das auf die Harte löschen: Connection, CommandObjekt, ExecuteNonQuery. Hat mich VB bei BindingSource.EndEdit angemeckert, weil ich damit praktisch ums DataSet herumgelöscht habe und BindingSource und Datenbank nicht mehr stimmig waren. Okay, sehe ich ein.

    Also über die BindingSource löschen. Wollte ich in einem ersten Schritt über BindingsSource.Find jeweils nach der ID des zu löschenden Datensatzes suchen und dann über BindingSource.RemoveAt diesen Datensatz löschen.

    Und jetzt meckert mich der Debugger an, dass die BindingSource kein ID-Feld enthält. Ich raff es einfach net. Vielleicht hab ich ja auch einen völlig falschen Ansatz gewählt. Ich füg mal den Codeausschnitt an und ein Bild von der Fehlermeldung. Ich schwöre euch, dass die der BindingSource zugrunde liegende Tabelle ein ID-Feld hat, das auch so heißt. Aber gut, DataMember ist ja nicht die Tabelle, sondern die Relation. Doch die Relation stellt die Beziehung im DataSet doch auch über die ID her. Also was für ein Problem könnte VB hier haben? Oder kann ich die Datensätze doch über eine Connection löschen (hat wenigstens problemlos gefunzt), aber dann müsste ich hinterher iwie die BindingSource aktualisieren.

    Bitte! Hilfe! ;(

    VB.NET-Quellcode

    1. Dim pos As Integer = 0
    2. If LöschListeEO.Count > 0 Then
    3. For Each order In LöschListeEO
    4. pos = OrderEinmaligBindingSource.Find("id", order)
    5. OrderEinmaligBindingSource.RemoveAt(pos)
    6. Next
    7. End If
    Bilder
    • ArgumentException.PNG

      39,03 kB, 1.014×321, 178 mal angesehen
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    dann programmier halt eine eigene Such-Schleife.
    Ich hatte bei anderer Gelegenheit auch Probleme mit der BindingSource.Find - Funktion.

    Ah - ja:

    VB.NET-Quellcode

    1. <Extension()> _
    2. Public Function FindX(ByVal subj As BindingSource, ByVal columnName As String, ByVal Key As Object) As Integer
    3. 'BindingSource.Find funzt nicht bei relateten BindingSourcses
    4. 'FindX = subj.Find(PropertyName, Key)
    5. For i As Integer = 0 To subj.Count - 1
    6. If DirectCast(subj(i), DataRowView)(columnName).Equals(Key) Then Return i
    7. Next
    8. Return -1
    9. End Function
    Jo, scheint dasselbe Problem zu sein, und dieses ist mein workaround. Ist in BindingSourceX in meine WinFormHelpers enthalten.
    Okay, dann geht das einfach nicht wegen der Relation. Hmmm... was eigenes zu machen wird nicht das große Prob sein. Entweder so ähnlich, wie du es gelöst hast, oder ich mach die zu löschenden Einträge unsichtbar und arbeite die Liste erst beim form_closing über ne Connection ab, also nach dem letzten BindingSource.EndEdit. Dann dürfte es auch net mehr chrashen.

    Auf jeden Fall vielen Dank
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D
    also ich empfehle meinen Workaround.
    Was du vorhast, ist genauso vorgesehen, und die entsprechende Methode hast du gefunden - nur ist sie Buggy.

    ah - du kannst auch mal DataTable.Find() ausprobieren, gewissermaßen eine Ebene tiefer gehen.
    DataTable.Find() ist nur auf PrimKeys anwendbar, aber das ist hier ja der Fall.
    GeilGeilGeil :thumbsup:

    Mit folgendem Code funzt es, dass die Funken fliegen ^^

    VB.NET-Quellcode

    1. If LöschListeEO.Count > 0 Then
    2. For Each order In LöschListeEO
    3. Dim zuLöschendeZeile As DataRow = DsFinanzKnecht.Tables("OrderEinmalig").Rows.Find(order)
    4. zuLöschendeZeile.Delete()
    5. Next
    6. End If


    Supertipp :thumbup:
    Ich code nur 'just for fun'! Damit kann ich jeden Mist entschuldigen, den mein Interpreter verdauen muss :D