Databindingsource-Sort sorgt für Fehler in DGV

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Nils_Kr.

    Databindingsource-Sort sorgt für Fehler in DGV

    Hi,

    ich hab ein Datagridview mit gebundenen Daten. Die Databindingsource sortiert automatisch mit Linienname ASC. Wenn ich den Namen jetzt im DGV ändere,
    ändert sich gleichfalls auch die Sortierung. Dabei wird ein Fehler ausgelöst, weil es scheinbar kurzzeitig eine Linie doppelt gibt und damit der Primärschlüssel doppelt ist.
    Wenn man die Fehlermeldung wegdrückt und den doppelten Eintrag auswählt erscheint wieder der Eintrag, der eigentlich an dieser Stelle stehen sollte und es geht
    problemlos weiter. Es macht keinen Unterschied, ob die ID angezeigt wird oder nicht.

    Der Fehler wird vom DGV verursacht nicht von den Daten selbst. Die Frage ist jetzt, wie ich die Sortierung in der Bindingsource behalten kann (die brauche ich an anderer Stelle),
    aber sie an anderer Stelle loswerden kann. Ich könnte natürlich für jedes Objekt eine eigene Bindingsource einrichten, aber mir wäre es lieber den Fehler zu beheben.

    Ps: Der Fehler ist ein System.Data.ConstraintException


    Die Fehlermeldung makiert mir nicht die Stelle im Quelltext. Wie komme ich an den Fehler ran? Ich hoffe, dass ein Refresh des DGV den Fehler behebt.
    Option strict = on

    If it's stupid and it works it ain't stupid.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Nils_Kr“ ()

    mir scheint, der Name ist gleichzeitig Primkey, oder hängt damit zusammen.
    Primkeys sollte man niemals ändern, also ändere dein Datenmodell dahingehend, dass der Name unabhängig wird vom Primkey. (Oder unterbinde die Möglichkeit einer Namens-Änderung).

    Aber sicher bin ich nicht - ich habe ja keinen Einblick in dein Datenmodell.
    Name muss geändert werden können, das verlangt das Nutzungsszenario. Der Name ist kein Primärschlüssel und auch nirgends damit verknüpft.
    Das einzige, was den String beachtet ist das "Titel ASC" in der BindingSource. Alles andere läuft über die diversen IDs.

    Weiterhin meine Frage, wo kann ich diesen Fehler behandeln?

    Option strict = on

    If it's stupid and it works it ain't stupid.
    Die Fehlermeldung ist doch eindeutig:
    Die Spalte ID hat in zwei unterschiedlichen DATENSÄTZEN den gleichen Wert. Dies ist bei einem Primärschlüssel aber nicht zulässig.
    Die Fehlermeldung des Bindungsscenarios Datenquelle => Bindingsource => Datagridview visualisiert lediglich diese ungültigen Daten in der Datenquelle.
    Daher kann auch keine Sourcecodezeile angegeben werden, der Fehler liegt ja in der Datenquelle.
    Lösung:
    Stelle sicher, das für der Spalte ID in der Datenquelle jeder Wert nur EINMAL vorhanden ist.
    tja dann weiß ich auch nicht.
    Das Datenmodell ist ein bischen verfänglich, denn die Relation Linie->Fehler ist redundant, der Zusammenhang ist ja bereits modeliert durch Linie->Fehlerbeschreibung->Fehler
    Aber keine Ahnung, ob das was damit zu tun hat.

    Auch stutzig macht mich:

    Nils_Kr schrieb:

    Die IDs sind nicht doppelt vorhanden. Nur im DGV werden sie doppelt dargestellt!
    Wie haste das hingekriegt, dass ein Dgv doppelt anzeigt, was nur einmal vorhanden ist?

    ErfinderDesRades schrieb:

    tja dann weiß ich auch nicht.
    Das Datenmodell ist ein bischen verfänglich, denn die Relation Linie->Fehler ist redundant, der Zusammenhang ist ja bereits modeliert durch Linie->Fehlerbeschreibung->Fehler
    Aber keine Ahnung, ob das was damit zu tun hat.

    Tatsache, das muss ich noch korrigieren, kann mir aber nicht vorstellen, dass das Auswirkungen auf den aktuellen Fehler hat.

    ErfinderDesRades schrieb:


    Auch stutzig macht mich:

    Nils_Kr schrieb:

    Die IDs sind nicht doppelt vorhanden. Nur im DGV werden sie doppelt dargestellt!
    Wie haste das hingekriegt, dass ein Dgv doppelt anzeigt, was nur einmal vorhanden ist?


    Wenn die Einträge im DGV sich durch die BindingSource in der Reihenfolge ändern kann temporär ein Duplikat entstehen. Klick man das Duplikat an verschwindet es.
    Das Duplikat ist auch kein eigener Datensatz, sondern es überschreibt nur einen anderen im DGV. Allerdings nur im DGV selbst. Das DataSet wird nicht angetastet.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Also das ganze Projekt posten kann ich nicht, weil es nicht für die Öffentlichkeit gedacht ist.
    Ich hab jetzt gerade versucht das Verhalten in einem neuen Projekt zu replizieren und da tritt der Fehler nicht auf.
    Ich werde jetzt mal anfangen Teile aus dem bestehenden Projekt zu löschen um zu gucken, ob ich den Fehler losbekomme.
    Ansonsten werde ich eine reduzierte Variante hier posten (ohne exe natürlich).

    E: Ich hab die überschüssige Relation rausgelöscht und einen Teil der Bindings neu gemacht und jetzt geht es wieder.
    Option strict = on

    If it's stupid and it works it ain't stupid.

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

    Nein & nein. An der Bindingsource hingen mehrere DGVs und eine Combobox, die über die Fremdschlüssel wieder mit anderen
    Sachen verbunden waren und ich gehe davon aus, dass sich da irgendwas in die Quere gekommen ist. Ein Teil, der thematisch
    etwas abgetrennt ist hat jetzt seine eigene BindingSource bekommen und seitdem läuft alles bestens.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Ah, ok.

    Ja, man muss sich überlegen, was man zusammen an eine BS hängen kann. ZB sollte man DGV-ComboboxColumns nicht an BindingSources hängen, an denen gleichzeitig auch DGVs, Combos oder Listboxen hängen.
    Weil mit letzteren steuert man ja den Datenfluss im Gesamt-View, und da kann mans nicht brauchen, wenn DGV-Combobox-Columns sich da einmischen.
    Da hatte ich auch gelegentlich unerwünschte Seiten-Effekte, aber sowas lustiges, wie was du berichtetest, noch nicht ;)

    Das führt natürlich dazu, dass man am Ende recht viele BindingSources da herumfahren hat - ich hab da oft Mühe, den Überblick zu behalten, welche BS nun für welches Control oder welche DGV-Column zuständig ist.
    Da wird mal wieder eine kurze und prägnante Benamung wichtig - weil Nomen est Omen!

    Aber das alles nur am Rande
    Das Löschen der redundanten Relation bereitet mir Probleme. Ich bekomme jetzt keine Ansicht mehr hin, die alle vorhanden Fehler einer Linie anzeigt.
    Ich hab eine Combobox, die mit DT_Linie verknüpft ist. Vorher hab ich im Datenquellenreiter DT_Linie ausgewählt und in diesem dann DT_Fehler.
    Jetzt müsste ich ja in DT_Linie DT_Fehlerbeschreibung und dann DT_Fehler auswählen. Wenn ich das mache bleibt das DGV allerdings immer leer.
    Ohne den Umweg über DT_Fehlerbeschreibung funktioniert es.

    Was funktioniert ist alle Fehler pro Fehlertyp anzuzeigen. Ich hätte aber gerne alle Fehler aller Typen pro Linie.
    Option strict = on

    If it's stupid and it works it ain't stupid.

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

    Das lässt sich mit einem geeignet gesetzten Filter bewerkstlligen.
    Mehr kann ich nicht dazu sagen, weil ich muss erst ein Test-Projekt suchen, mit geeignetem Datenmodell und Daten, dassich bischen rumprobieren könnte.

    Hab ihn :D

    VB.NET-Quellcode

    1. Private Sub bsKunden_CurrentChanged(sender As Object, e As EventArgs) Handles bsKunden.CurrentChanged
    2. Dim rwKunde = bsKunden.At(Of KundenRow)()
    3. bsDetails.FilterX(True, "Parent(BestellungenBestelldetails).KundeID = ?", rwKunde.KundeID)
    4. Dbg(bsDetails.Filter)
    5. End Sub

    Das Datenmodell dazu:

    Ich hoffe, du kannst das auf deine Verhältnisse übertragen

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