Announcement

Collapse
No announcement yet.

DGV von DataTable durch BindingSource.Suspend trennen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DGV von DataTable durch BindingSource.Suspend trennen

    Hallo Leute,

    hab mich eben schon im Forum nach ähnlichen Beiträgen gesucht und hoffe, dass ich hier kein Crossposting erzeuge.

    Bei meinem Problem geht es um die Darstellung und Änderung von Daten in einer DataTable.

    Ich schreibe an einer Protokollierungssoftware und möchte auftretende Ereignisse in einem Datagridview darstellen.

    Um zu verhindern, dass der Speicherbedarf nicht ins unermessliche steigt sollen in dem Grid immer nur die letzten x (z.B. 2500) Einträge angezeigt werden.
    Aktualisierungsinterval ca 1 Sekunde. Daher sollte das auch recht schnell gehen.

    Momentan habe ich es wie folgt umgesetzt.
    Im Hintergrund arbeiten zwei Backgroundworker. Einer fügt die neuen Einträge in die Datatable ein und der Andere löscht die alten Datensätze, die über die Buffergröße von 2500 hinausgehen wieder raus.

    Eingefügt wird mit DataTable.Rows.Add( ... )
    gelöscht durch DataTable.Rows.DeleteAt(0)

    Zunäch hatte ich alle im Mainthread - Ging auch gut, wenn man bedenkt, dass in der Zeit mit dem Programm nichts anzufangen war, wenn mal 1000 Datensätze eingetroffen sind.

    Einfügen und Löschen sind auch mit einer Semaphore gegeneinander abgesichert, so dass sich diese Thread nicht in stören.
    Ich habe die Aktualisierung auch bewusst nicht in einen Thread (erst einfügen und dann gleich löschen) untergebracht, damit das Einfügen höher proirisiert werden kann und nur im Leerlauf die alten einträge gelöscht werden
    (Insert unterbricht Löschvorgang über einen Interrupt).

    Die Datasource von dem Grid ist über eine Bindingsource, über ein DataView mit der Datatable verbunden.

    Mit der Bindingsource wollte ich nun verhindern, dass die Daten in dem Datagrid übernommen werden, solange die einzelnen Einträge gelöscht oder hinzugefügt werden.

    Also:
    [highlight=vbnet]
    '...

    me._bsGrid2Prot.SuspendBinding
    while me._dtProt.Rows.Count > me._nBufferSize
    me._dtProt.Rows.DeleteAt(0)
    end while
    me.__bsGrid2Prot.ResumeBinding

    ' ...
    [/highlight]

    Da die Änderungen trotz des Suspend weiter auch in dem DataGridView geändert werden habe ich das Gefühl, dass ich den Sinn der Pausierung in der BindingSource noch nicht verstanden habe.

    Das Problem besteht nun darin, dass das Programm auf einen Fehler läuft, wenn man in der Zeit in der man in dem Protokoll scrollt oder eine Zeile anklickt in eine OutOfRangeException läuft.

    Hat jemand ne gute Alternative?
Working...
X