Laden...

[gelöst] Best Practice: Daten aus DataGridView an eigene Klasse zur Verarbeitung übergeben

Erstellt von KingMike vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.206 Views
K
KingMike Themenstarter:in
8 Beiträge seit 2012
vor 10 Jahren
[gelöst] Best Practice: Daten aus DataGridView an eigene Klasse zur Verarbeitung übergeben

Hallo Zusammen,

ich brauche eure Hilfe 😄. Ich möchte mir zum Üben eine Art Zeiterfassung schreiben und dabei View von Verarbeitungslogik trennen.

In einem DataGridView kann der Anwender seine Zeiten eintragen. Das DataGridView hat als DataSource ein DataTable mit den folgenden Feldern: Datum, Tätigkeit, Startzeit, Endzeit, Benötigte Zeit in Minuten. Um die Daten jetzt zu validieren (z.B. ob eine korrekte Uhrzeit / korrektes Datum eingegeben wurde; Berechnung der Benötigten Zeit in Minuten) habe ich mir gedacht eine eigene Klasse zu bauen, die diese Logik beinhaltet.

Die Frage die sich jetzt mir stellt ist die, wie man es am saubersten macht. Aktuell habe ich der Form eine Liste der "Logikklasse" gegeben. Diese Logikklasse beinhaltet die Eigenschaften "Datum", "Tätigkeit", "Startzeit", "Endzeit", "Benötigte Zeit in Minuten". Jedesmal wenn ein Datensatz im DataGridView angelegt wird, wird der Liste auch ein weiteres Element hinzugefügt. Wenn ein Feld des Datensatzes (im DataGridView) validiert (über das Event "CellValidating") wird, schreibe ich dann den jeweiligen Feldwert in dieses Element der Liste, der Logikklasse (Zuweisung zur Eigenschaft der Logikklasse). Mit der Logikklasse kann dann auch die jeweilige Zeile exportiert werden, weshalb ich ja die Daten aus der View an diese Klasse weiterleiten muss.

Ich bin mir nicht wirklich sicher ob das sauber ist. Was meint Ihr denn dazu bzw. wie macht man denn sowas gewöhnlich? Für den Fall, dass es alles andere als sauber ist, könntet Ihr mir vielleicht auf die Sprünge helfen? 😉 Ich hab da so meine Zweifel 👅 Ich hoffe Ihr wisst was ich meine 😉 Wenn nicht könnt Ihr gerne nachfragen.

Wäre wirklich toll.

Vielen Dank und beste Grüße schon mal für eure Hilfe

4.931 Beiträge seit 2008
vor 10 Jahren

Hallo,

du könntest auch einfach - anstatt der DataTable - eine BindingList<Logikklasse> an das DataGridView binden (so daß du die Informationen nicht doppelt zu pflegen brauchst).

Es kommt aber darauf an, was du sonst noch mit der DataTable in deinem Programm anstellst (z.B. direkt aus der Datenbank lesen bzw. Änderungen updaten).

S
80 Beiträge seit 2012
vor 10 Jahren

Die Logik Klasse sollte in erster Linie eine Abbildung deiner Datenbanktabelle darstellen und zwar die jeweilige Zeile. Eine Collection wäre somit eine Tabelle.
Wenn es für dich einfacher ist zum verstehen.

Das DataGrid UserControl an sich sollte das Design und den Controller darstellen.

Du erstellst eine Liste mit deiner Logik Klasse und bindest (Binding) es an dein DataGrid. Statt die Columns Name im DatTable selbst zu definieren, kannst du z.B. in der Logik Klasse Property Descriptoren verwenden, wo du jedem Property einen Aliasname gibst, welches dann als Spaltenüberschrift auftaucht.

Desweiteren würde ich mir noch folgende Interfaces anschauen:

  • INotifyPropertyChanged. Reagiert, wenn ein Property geändert wird.
  • INotifyCollectionChanged. Reagiert, wenn eine Collection geändert wird.

----ehm............

K
KingMike Themenstarter:in
8 Beiträge seit 2012
vor 10 Jahren

Hallo Ihr beiden,

danke für eure schnelle Antwort 🙂. D.h. wenn ich ich die "Logikklasse" dann an die "DataGridView" binde, wirkt sie sozusagen als Liste und ich kann dann später im Code auf diese Liste mit dem jeweiligen Index zugreifen oder? Ich denke ich hab das richtig verstanden? 8)

@Th69: Die DataTable habe ich eigentlich nur deswegen erstellt um die Daten in der DataGridView darzustellen. Die Daten werden nur vom Anwender eingegeben. Eine Datenbank oder ähnliches steckt vorerst noch nicht dahinter.

@Schildkroete: Danke 🙂 Das werde ich doch glatt mal ausprobieren 😉

@all: Jetzt hab ich aber noch eine Frage an euch beide zur Trennung von Oberfläche und Logik.

Angenommen es würde jetzt kein DataGridView verwendet werden sondern einfach auf der Form platzierte Textboxen und 4 Buttons mit denen ich einen Datensatz zurück, einen Datensatz vor gehen, einen Datensatz löschen und einen Datensatz einfügen kann. Hier würde ich dann der Form auch wieder eine Liste<Logikklasse> zuweisen und dann die Daten in den jeweiligen Buttons aus der Liste auslesen bzw. einfügen, hab ich recht? 8) Wobei ich glaube in diesem Fall gibt es ja das Control BindingNavigator mit dem man es realisieren könnte oder? Hier würde ich dann als DataSource wahrscheinlich auch wieder meine Liste auswählen? 🙂 Stimmts? 😜

Also im Grunde genommen wäre meine im ersten Post geschriebene Variante unsauber oder?

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo KingMike,

ja, auch für TextBoxen kannst du DataBinding verwenden und ja, du hättest auch da (nur) eine List<Logikklasse> bzw. BindingList<Logikklasse>.

Und ja, der Ansatz im Startpost ist unsauber.

herbivore

K
KingMike Themenstarter:in
8 Beiträge seit 2012
vor 10 Jahren

Hallo Zusammen,

super Danke! 😃 Hat genau so funktioniert wie Ihr es mir geschildert habt.

Danke für Eure Hilfe, Ihr habt mir wirklich einiges klar gemacht. Ich habe diesbezüglich noch eine andere Frage und werde hierzu einen neues Thema eröffnen.

Viele Grüße