Laden...

Schließen von Form soll Aktivitäten eines anderen Objekts abbrechen

Erstellt von PeterRRR vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.289 Views
P
PeterRRR Themenstarter:in
50 Beiträge seit 2009
vor 12 Jahren
Schließen von Form soll Aktivitäten eines anderen Objekts abbrechen

Ich habe ein Form, das als Property ein Objekt "Query" hat. Das Form stellt gewisse Daten in einem Gridview dar, das Query ist dafür verantwortlich, diese Daten aus der Datenbank zu laden.

Auf der Form gibt es auch einen Refresh-Button, dieser lädt die Daten nocheinmal neu aus der Datenbank. Das wird beim Query die Methode "Refresh" aufgerufen. Diese macht eben die Datenbankabfrage (asynchron) und stellt die Daten, wenn sie fertig geladen wurden im Datagridview des Form dar.

Das Problem dabei ist, dass das Form vom Benutzer geschlossen werden kann, während die Datenbankabfrage aktiv ist. Dann kommt es natürlich zu Problemen, sobald das Query fertig ist und auf die Form zugreifen möchte.

Eine Möglichkeit wäre nun, beim Query einen Status zu setzen ("active"), wenn es eben aktiv ist und beim Beenden des Forms darauf zu überprüfen und das Schließen zu Unterbinden. Die schönere Option wäre aber, alle Aktivitäten des Query beim Schließen des Form zu beenden. Nur wie macht man das am besten? Ich meine, das Query hat ja wieder einige andere Objekte, die aktiv sind, es arbeitet mit Callbacks usw. All das müsste dabei natürlich beachtet werden. Gibt es eine "einfache" Methode, dieses Vorhaben umzusetzen?

Danke und LG
Peter

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo PeterRRR,

dein Query Objekt sollte nie auf die Form zugreifen können.
Es sollte überhaupt nicht wissen dass es ein Form gibt.

Am Besten löst du das mit Events. D.h. vom Form aus startest du den Refresh in dem Query Objekt. Sobald dieses fertig geladen hat feuert es ein Event.
Danach wird dieses Event gehandelt wo es gebraucht wird, nicht mehr und nicht weniger.

Am Besten baust du im Query-Objekt noch eine Funktionalität ein um das Laden der Daten abbrechen zu können. Damit du nicht unnötigerweise im Hintergrund weiterlädst / verarbeitest.

Das System.IDisposable Interface kannst du da auch implementieren und verwenden.

Grüße
Michael

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo PeterRRR,

da mal eine laufende Datenbankabfrage wohl nur hart abbrechen kann und das harte Abbrechen keine so gut Idee ist, solltest du die Abfrage besser weiter laufen lassen und lediglich verhindert, dass die Aktualisierung des Forms angestoßen wird. Siehe dazu Threading in Fenstern: korrekte Vorgehensweise beim Schließen der Form.

herbivore

P
PeterRRR Themenstarter:in
50 Beiträge seit 2009
vor 12 Jahren

Danke euch beiden für die Antworten.

dein Query Objekt sollte nie auf die Form zugreifen können.
Es sollte überhaupt nicht wissen dass es ein Form gibt.

OK, genau das ist aber im Moment der Fall. Die Form hat ein Query-Objekt und dieses wiederum hat eine Referenz auf die Form.
So gesehen ist schon das Design Mist. Also wird es wohl am besten sein, das alles so umzubauen, dass es dem MVC-Konzept entspricht, nicht wahr? Das ganze zur Zeit vorhandene Design stammt nämlich nicht von mir sondern von einem Kollegen. Ich soll die Anwendung jetzt um zusätzliche Funktionalität erweitern, und dabei bin ich eben auf dieses Problem gestoßen.

LG Peter

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo PeterRRR,

Also wird es wohl am besten sein, das alles so umzubauen,

ja, es ist auf jeden Fall sinnvoll, es so umzubauen, dass die Query das Form nicht kennt, ...

dass es dem MVC-Konzept entspricht, nicht wahr?

... aber ob du MVC nimmst oder eine anderen GUI-Pattern oder was eigenes, was den geringsten Änderungsaufwand verursacht, halte ich für vollkommen offen. Über die "beste" GUI-Technologie gibt es im Forum schon eine ganze Reihe von Threads. In diesem Thread hier soll sollte es jedenfalls nicht weiter darum gehen.

herbivore