PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : .NET DataGridView - Serialisierung?


Monger
2008-02-13, 14:52:59
Ich hätte da mal wieder so ein kleines Problemchen...

Ich möchte ein kleines Programm von Java auf .NET umsetzen. Die gesamte Programmlogik hab ich mittlerweile erfolgreich umgesetzt, und jetzt bin ich daran, an der Oberfläche zu basteln.

Ich verwende eine DataGridView, um eine Reihe von Daten zu erzeugen. Ziel ist, eben diese Tabelle (plus noch einige andere Parameter) als Dokument/Speicherstand irgendwo abzulegen, um den Programmzustand genau so wieder später auch laden zu können.
Unter Java hab ich einfach ein Objekt genommen, das mit Listen und Attributen vollgestopft und dann wegserialisiert. Nicht schön, hat aber funktioniert, aber ich würde jetzt gerne eine elegantere Lösung haben.

Deshalb meine Fragen:

- Wie bekomme ich am einfachsten den Inhalt des DataGridView als Objekt, so dass ich diesen Inhalt dann vorzugsweise als XML serialisieren kann? Ich hab schon über DataSource eine DataTable angebunden, aber irgendwie stelle ich mich da dämlich an. Wenn ich die zu XML serialisiere, bekomme ich nur leere Einträge. Ich könnte wohl die ganzen Columns auch per Hand in die DataTable reinfrickeln, aber dann wird es halt schon wieder relativ kompliziert.

- Wie kombiniere ich am intelligentesten diese Daten mit anderen Informationen? Ich hab z.B. Speicherpfade und irgendwelche Optionen, die zwingend an eben diesen Speicherstand gebunden sein müssen. Kann mir da jemand einen Tipp geben, wie man so etwas am besten und schönsten serialisiert?

gr@fz@hL
2008-02-13, 16:06:54
schau mal hier: http://msdn2.microsoft.com/de-de/library/58a18dwa(VS.80).aspx

Monger
2008-02-13, 16:38:05
Ok danke, damit sollte sich das serialisieren lösen lassen. Ich brauch tatsächlich beides: einerseits die Tabelle serialisieren (die sich dann praktischerweise auch in Excel öffnen lässt, wie ich schon ausprobiert habe), andererseits eben ein Objekt was u.a. diese Tabelle sowie ein paar Strings und einige elementare Typen enthält. Beides steht in dem Link drin, also wunderbar!


Das einzige echte Problem was ich jetzt noch habe, ist die Verknüpfung zwischen DataGridView und DataTable. Wenn ich von Hand eine DataTable mache, geht das ohne Probleme. Wenn ich eine DataTable als Source für die DataGridView angebe, stehen da zwar ein paar Rows drin, aber keine Columns. Ich könnte die jetzt natürlich von Hand nachtragen, aber... geht das nicht auch besser?

Und mir ist auch das Handling noch nicht wirklich klar. Wenn ich z.B. die DataTable gegen was anderes austausche - wie bringe ich die DataGridView dazu, genau das anzuzeigen was die neue Source hergibt?

gr@fz@hL
2008-02-13, 22:57:12
Das einzige echte Problem was ich jetzt noch habe, ist die Verknüpfung zwischen DataGridView und DataTable. Wenn ich von Hand eine DataTable mache, geht das ohne Probleme. Wenn ich eine DataTable als Source für die DataGridView angebe, stehen da zwar ein paar Rows drin, aber keine Columns. Ich könnte die jetzt natürlich von Hand nachtragen, aber... geht das nicht auch besser?

Und mir ist auch das Handling noch nicht wirklich klar. Wenn ich z.B. die DataTable gegen was anderes austausche - wie bringe ich die DataGridView dazu, genau das anzuzeigen was die neue Source hergibt?
Das DataGridView-Objekt ist im Endeffekt nicht anderes als das Control-Element zur Anzeige der Daten. Die daten selber werden im Dataset (und dort in den DataTables) gehalten. Verbunden werden DataGridView und DataTable mittels des BindingSource-Objekts. Wenn das Grid andere Daten anzeigen soll, musst du also nur der DataSource-Eigenschaft des Grids eine ander BindingSource zuweisen. Und ja, leider musst du einem Datatable alle Mitglieder (Rows und Columns) extra zuweisen.

Wenn du die externen Daten übrigens in Excel braucht, musst du dich evtl. nicht mit dem XmlSerializer rumschlagen, sondern könntest deine DataTable per TableAdapter mit der Exceldatei verknüpfen; also im Endeffekt genauso, als wenn du eine externe Datenbank ansprichst.

Monger
2008-02-14, 12:23:34
Habs mittlerweile hingekriegt. Im Endeffekt war es dann trivial: ERST die Datenquelle (in diesem Fall ein Dataset) anbinden, DANN die verfügbaren Columns anbinden und bearbeiten.

Jetzt hänge ich dabei, wie eine eigene Sortierung dem Grid aufzwingen kann, denn für gebundene Daten lässt er einem da wenig Spielraum...

Aber wenigstens bin ich schonmal zwei Schritte weiter. Danke!

gr@fz@hL
2008-02-14, 13:05:39
Jetzt hänge ich dabei, wie eine eigene Sortierung dem Grid aufzwingen kann, denn für gebundene Daten lässt er einem da wenig Spielraum...
Datagridview hat ne eigene Sort-Methode: http://msdn2.microsoft.com/en-us/library/0868ft3z.aspx

Ansonsten gibt es auch ne Sort-Property der BindingSource.

Matrix316
2008-02-14, 13:10:38
Du kannst entweder die Daten an sich neu sortieren und dann dem Gridview neu zuweisen, oder über sort:

DataSet myDataSet = (DataSet? vielleicht auch ohne Cast)gGridView.DataSource;
DataTable dtTable = myDataSet .Tables[0].Copy();

dtTable.DefaultView.Sort = "Spaltenname Sortierreihenfolge"

und dann wieder zuweisen:

gGridView.DataSource = dtTable; // sollte gehen
gGridView.DataBind();

Monger
2008-02-14, 13:36:52
Datagridview hat ne eigene Sort-Methode: http://msdn2.microsoft.com/en-us/library/0868ft3z.aspx


Ansonsten gibt es auch ne Sort-Property der BindingSource.

Ich brauch leider was komplexeres, und .sort(IComparer) (http://msdn2.microsoft.com/en-us/library/wstxtkxs.aspx) funktioniert leider nur mit ungebundenen Quellen.

Ich möchte gerne zwei Sachen tun:

1) Spalten die eine Combobox haben in der Reihenfolge sortieren, in der die Combobox Einträge definiert sind.

2) Mehrere Spalten in Abhängigkeit zueinander sortieren, aber eben nicht zwingend sortenrein.

In beiden Fällen muss ich die natürliche Ordnung der Elemente beeinflussen, ich weiß aber noch nicht so recht, wie. Das Dataset scheint mir in der Hinsicht zu unflexibel. Diese komischen LINQ Queries reichen mir wohl nicht aus, und die DataGridView sperrt mir anscheinend alles was ich gebrauchen könnte, sobald ich eine gebundene Quelle habe.

gr@fz@hL
2008-02-14, 23:19:29
Ich steh gerade total auf dem Schlauch und weiß nicht so recht, was du willst... ich schiebs auf meine Erkältung oder darauf, dass ich eigentlich ein Anfänger bin ;)

zu 1) Du kannst einer Combobox ebenfalls eine Datasource zuweisen. Wenn du jetzt eine Tabelle mit den Spalten "ID" und "Text" anlegst, diese als DataSource für deine Combobox wählst, als und noch die Eigenschaften ValueMember = ID, DisplayMember = Text zuweist, müsstest du deine Sortierung nach dem Index der Box bekommen.

zu 2) Die BindingSource.Sort-Eigenschaft erlaubt mehrere Spaltennamen hinetreinander. Oder willst du die Reihenfolge der Spalten ändern?

Monger
2008-02-15, 14:34:28
zu 1) Du kannst einer Combobox ebenfalls eine Datasource zuweisen. Wenn du jetzt eine Tabelle mit den Spalten "ID" und "Text" anlegst, diese als DataSource für deine Combobox wählst, als und noch die Eigenschaften ValueMember = ID, DisplayMember = Text zuweist, müsstest du deine Sortierung nach dem Index der Box bekommen.

Die Combobox ist eigentlich erstmal völlig egal. Ich will nur, dass der Anwender z.B. Montag, Dienstag, Freitag in diese Spalte eintragen kann, und diese Spalte dann auch tatsächlich in dieser Reihenfolge sortiert wird. Zuerst wollte ich die natürliche Ordnung des Enums dafür nutzen, aber C# kennt das im Gegensatz zu Java nicht.
Der zweite Gedanke war halt, sich die Reihenfolge aus der Dropdownbox zu holen. Hätte auch den Vorteil, dass man direkt im Designer mal schnell die Reihenfolge umwerfen kann ohne den Code anzufassen.

zu 2) Die BindingSource.Sort-Eigenschaft erlaubt mehrere Spaltennamen hinetreinander. Oder willst du die Reihenfolge der Spalten ändern?
Wie jetzt auch oben für die DropDownBox beschrieben, brauche ich mehr Kontrolle über die Sortierung. Die textuelle oder numerische Sortierung reicht mir schlicht nicht.
In meinem Fall hab ich da einen relativ komplizierten Algorithmus, der die Startaufstellung in einem Turnier berechnet, und da wird anteilsmäßig die Turnierklasse und die Platzierung darin gewichtet. Dazu muss ich eben wenigstens zwei Spalten so halb miteinander verrechnen, um daraus die Reihenfolge zu ermitteln.


Ich hab übrigens mittlerweile mich mal quer durchs Internet geforstet, und ich bin nicht der einzige mit solchen Problemen. Die DataGridView kann mit bound Sources und Custom sort einfach nicht umgehen, und auch wenn man hintendran per DataView rumrödelt, kommt man auf keinen grünen Zweig.

In meinem Fall komme ich erstmal damit zurecht, wenn ich alle Zeilen auslese, sie in Objekte packe, die in einer Liste verstaue und wieder zurückschreibe nachdem ich den DataTable gereinigt habe.

Wenn man das nicht kann, gibt es offenbar nur noch die Möglichkeit mit versteckten Sortierspalten (was natürlich die Datenhaltung klittert) und einer eigenen Implementierung einer DataView (was zum einen ziemlich aufwändig ist, und zum anderen einem die Chance nimmt, seine Feineinstellungen über den Designer vorzunehmen).

Blöd. Ich hab auch jemanden gefunden, der gegen MS da einen Request gestellt hat das doch bitte zu beheben, der ist aber mittlerweile zwei Jahre alt. Da tut sich also vermutlich nix mehr.