Datagridview, System.ArgumentNullExeption: Der Wert darf nicht Null sein. Parametername: key ...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datagridview, System.ArgumentNullExeption: Der Wert darf nicht Null sein. Parametername: key ...

    Moin Community,

    ich hab ein mittel schweres Problem mit meinen Datagrids und finde nirgends eine Lösung. Ansich wollte cih alles in die Tonne treten und neu machen, bekomm nun aber Druck aus der GL das das Programm fertig wrrden muß #UndankIstDerWeltenLohn

    Zur Ausgangssituation:
    Ich habe ein Form, das zur Laufzeit, anhand einer Technikerlliste, für jeden Techniker eine Liste mit seinen Aufträgen anzeigen soll.
    Für jeden Techniker wird hierbei ein Usercotrol erstellt, das neben einigen anderen Steuerelementen primär ein Datagridview enthält.
    Sowohl das Form als auch das Usercontrol enthalten die beiden geleichen Datasets, welche ich per DBEx im Form befülle und über Filter in den Usertcontrolls dann je nach Techniker anzeige.
    Bis dato alles super



    Mein Problem entsteht sobald ich in der letzten Spalte bei der Combobox Techniker den Wert ändere (z.B. vom 'mx' in 'mm') und die Zeile wechsle.

    Im UC wird dann folgendes Ausgeführt

    VB.NET-Quellcode

    1. Private Sub OnCellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles dgvTickets.CellEndEdit
    2. RaiseEvent _aktualisieren(Me, EventArgs.Empty)
    3. End Sub


    Das Event soll vom Form verarbeitet werden. Hier mal die Register für die DBEx, die Erzeugung der UserControls und das Event.

    VB.NET-Quellcode

    1. Private Sub BindDataset()
    2. Dim adpDispatching = New DatasetAdapter(
    3. MySql.Data.MySqlClient.MySqlClientFactory.Instance,
    4. My.Settings.db_dispatchingConnectionString,
    5. ConflictOption.OverwriteChanges)
    6. Db_serviceticket.Adapter(adpDispatching).Register(Me, True)
    7. Dim adpCommerz = New DatasetAdapter(
    8. MySql.Data.MySqlClient.MySqlClientFactory.Instance,
    9. My.Settings.commerzConnectionString,
    10. ConflictOption.OverwriteChanges)
    11. Db_commerz.Adapter(adpCommerz).Register(Me, True)
    12. Dim adpkis = New DatasetAdapter(
    13. MySql.Data.MySqlClient.MySqlClientFactory.Instance,
    14. My.Settings.kisConnectionString,
    15. ConflictOption.OverwriteChanges)
    16. Db_kis.Adapter(adpkis).Register(Me, True)
    17. End Sub
    18. Private Sub createTechnikerview(ByVal techniker As String)
    19. Dim tv As New Technikerview(techniker)
    20. tlpTechniker.Controls.Add(tv)
    21. tv.Dock = DockStyle.Fill
    22. AddHandler tv._aktualisieren, AddressOf safe
    23. AddHandler tv._close, AddressOf tvClose
    24. End Sub
    25. Private Sub safe(sender As Object, e As EventArgs)
    26. Db_serviceticket.Save(Me, True)
    27. Db_serviceticket.tbl_serviceticket.Fill("WHERE status <> 14 AND status <> 39 AND status <> 102 ORDER BY Datum DESC")
    28. End Sub


    Leider kommt es hier sehr Oft zu folgendem Fehler:

    Der Datensatz wird mir zwar dann korrekt im Datagridview das anderen Technikers angezeigt, aber die Fehlermedung wird endlos oft wiederholt (rein vom Gefühl für jede Zelle in jeder Zeile in jedem Datagridview ein mal)

    Die Fehlermeldung bringt mir insofern nichts, als das ich nicht verstehe was VisualStudio von mir will.

    Wenn ich es recht verstehe, hat es ein Problem damit, dass eine Combobox kein Value zu dem Wert 'NULL' findet. Wenn ich es richtig ausklabustert habe, kommt der Ursprung des Fehlers aus der Zelle des Datagrids das den Datensatz mal enthalten hat, nun aber aufrgrud des Filters nichtmehr hat. Jedenfalls erzeugt mir dieses Datagridview, wenn ich die Fehler lang genug bestätige, eine leere Zeile. Das es für eine Combobox schwer ist, einen Wert zu einer einer, für sie nicht merhr vorhandenen Zeile zu finden ist mir ja durchaus verständlich, aber ich begreife nicht warum sie es überhaupt versucht.

    Ich habe schon alle Seiten die Googel zu diesem Fehler ausspuckt durchgeklickt, aber wirklich eine Lösung habe ich nicht gefunden. Ich hoffe inständig das ich irgendwo nur einen groben Schnitzer im Code hab oder irgendwass essentielles übersehe, ansonsten war meine Arbeit zwar lehrreich, aber für die Tonne.

    PS: Bevor einer fragt, warum ich nach dem Db_serviceticket.Save noch ein Db_serviceticket.tbl_serviceticket.Fill mache. Es gibt insgesammt 3 Anwendungen, welche Änderungen an der Tabelle machen, und diese muß ich natürlich irgendwie auch in meinem Form abbilden.
    Befüllst du für deine DGVs zufällig ein View? Und wenn ja, enthält dieses View eine Spalte aus einer Tabelle, welche nicht Null sein darf? Das war zumindest bei mir immer das Problem, das ein View Daten aus 2 Tabellen enthält, aber nicht für jeden Datensatz aus Tabelle A ein Gegenstück in Tabelle B ist. Wenn aber nun in Tabelle B ein Feld nicht Null sein darf und es ist im view enthalten, meckert das Programm natürlich. Hier hilft es im Dataset bei dem entsprechenden View die Spalten auf AllowDBNull True zu setzen
    naja, deine aktualisierung wird ja letztendlich im DGV_CellEndEdit ausgelöst.
    Das ist ein ungünstiger Zeitpunkt, weil da ist die Eingabe des Datensatze noch garnet abgeschlossen (vorgesehen ist eiglich, dass noch weitere Zellen editiert werden könnten).
    Das Fill löscht vorm Befüllen alle vorherigen Daten, und stellt noch einiges weitere zeitweilig um im Dataset.
    Das verträgt sich wohl nicht gut mit der Tatsache, dass die Datensatz-Eingabe noch nichtmal abgeschlossen ist.

    Naja - das BeginInvoke verschiebt nun den Befüll-Vorgang auf einen späteren Zeitpunkt, wo die Eingabe dann bereits abgeschlossen ist, unds sich nicht mehr beisst.

    Ich bin nicht so der Freund automatischen savens, und erst recht nicht von automatischer Befüllung.
    Die Befüllung dürfte dir auch die Selection umstellen, oder? Also dass auf einmal ein anderer Datensatz selectiert ist als vorher, oder?