Re: Datatable interer Original-Index beim Sortieren
From: Peter Fleischer (peter.fleischer_nospam__at_gmx.de)
Date: 02/24/05
- Next message: Peter Fleischer: "Re: Tabelle hinzufügen"
- Previous message: fabian meier: "Tabelle hinzufügen"
- In reply to: Jens Meyer: "Re: Datatable interer Original-Index beim Sortieren"
- Next in thread: Jens Meyer: "Re: Datatable interer Original-Index beim Sortieren"
- Reply: Jens Meyer: "Re: Datatable interer Original-Index beim Sortieren"
- Messages sorted by: [ date ] [ thread ]
Date: Thu, 24 Feb 2005 09:32:09 +0100
Jens Meyer wrote:
...
> Ich habe ein eigenes Grid von Grund auf erstellt. Es war als
> Ungebundenes Grid konzipert, weil ich es für "einfache Daten", die
> nicht in einer Bank vorliegen, haben wollte.
Jens,
das ist zwar schön, aber gerade das dotNET-DataGrid ist für solche
Anwendungen bestens geeignet. Du brauchst beim DataGrid keine Datenbank. Das
Grid holt sich die Daten aus einem Puffer. Und das kann ein Array, eine
DataView usw. sein. Das DataGrid puffert intern nichts und holt sich bei
jedem Paint die Daten aus der DataSource, z.B. dem gebundenen Array oder
DataView. Beim Paint kannst du festlegen, was, wie und z.B. in welcher Farbe
in die Zelle zu "malen" ist.
>> Wie färbst du denn eine Zeile ein? Da muss es doch ein Kriterium
>> geben, nach
>> welchen die anzuzeigende Farbe festgelegt wird. Und dieses Kriterium
>> hängt üblicherweise von den Daten in einer Zeile ab, z.B. ID.
>
> Mein Grid besteht aus einer Spaltencollection, in der sich je eine
> RowCollection
> befindet. Innhalb dieser RowCollection liegen zusatzinfos wie Farbe,
> höhe usw.
> Intern habe ich eine "extraRow-Collection" die die generellen Infos
> zur Zeile enthält.
Das scheint mir etwas umständlich. Warum machst du es nicht so, wie es das
DataGrid macht?
> Das Einfärben geschieht sozusagen in 4 Stufen (von hinten angefangen)
> a) ist in der RowCol zur Spalte eine Farbe angegeben wird diese
> verwendet(Zelle)
> b) wenn bei a keine Info dann.. prüfe ich die "extraRow". ist dort
> eine Farbe angegeben, wird diese
> verwendet (die gesamte Zeile)
> c) ist bei b auch keine Info, dann wird die Farbinfo aus der
> SpaltenColl genommen (gesamte Spalte einfärben)
> d) ist c auch nichts, dann wird die "hauptfarbe" meines Grids
> verwendet
Genau das kannst du beim DataGrid über den ColumnStyle genau so problemlos
regeln. Wenn Paint eine Zelle zu "malen" hat, greift dein privater
Algorithmus zur Auswahl der Hintergrundfarbe, der Textfarbe, der Bilder, der
Textgrösse, der Textorientierung usw. Dieser Algorithmus kann dann abhängig
vom konkreten Datensatz usw. entscheiden.
> Klingt vielleicht kompliziert, aber so habe ich die Möglichkeit alles
> und jedes auch für eine Zelle einzustellen.
Dann schau dir mal das Beispiel von meiner Homepage an. Da kannst du es
genau so auch mit dem DataGrid machen.
>> Wenn die Darstellung an den Inhalt der Zeile gebunden ist, dann ist
>> die Sortierfolge egal. Wenn du jedoch die Farbgebung an temporäre
>> Bedingungen bindest, wie beispielsweise aktuelle Zeilennummer im
>> Grid, dann musst du diese Bedingungen auch nachführen. Nicht nur
>> beim Sortieren kann das von Bedeutung sein, sondern auch beim
>> Filtern oder Hinzufügen oder Löschen von Datenzeilen.
> Da ist das eigentliche Problen, da ich die Datentabelle samt View
> "hinterher" zugeschustert habe,
> da das Grid dafür nicht gedacht war.
> Ich verzichte auf die RowColl der Spalten und nehme dafür die daten
> aus der Table. Auch für
> die Wesentlichen Infos zur Spalte stammt von dort.
Und warum erstellst du nicht deinen eigenen DataView? Im das DataView-Objekt
legt über die eigentliche DataSource eine ArrayList, die die
"Adress-Umsetzung" steuert. Am Anfang steht in der ArrayList eine
1:1-Umsetzung, d.h. der zehnte Datensatz, den das DataView-Objekt liefert,
ist auch der zehnte Datensatz der eigentlichen DataSource. Nach der
Sortierung stehen in der ArrayList die "Zeiger" in veränderter Reihenfolge,
so dass der zehnte Zeiger nicht mehr zwingend auf den zehnten Datensatz der
eigentlichen DataSource zeigt. Wenn gefiltert wird, dann wird einfach nur
die YAnzahl der Elemente ("Zeiger") in der ArrayList verändert.
> Es funktioniert momentan in der Art, das wenn eine datatable
> angegeben wird. Ich intern
> meine Spaltencollection aufbaue - gleiche Anzahl Spalten wie die
> Datatable hat, und meine
> "extraRow", die genauso dimensioniert ist wie ich Zeilen in der DT
> habe.
Das ist doch alles etwas umständlich. Versuche es mal mit dem Beispiel von
meiner Homepage.
> Da ich nun keinen Einfluss mehr auf die Sortierung habe, kann ich
> meine "extraRow" nicht
> "mitsortieren". So das in der ExtraRow an 5. Stelle steht "rot". Nun
> wird die Table extern
> sortiert und die Zeile der früher an 5 war, ist nun an position 30.
Die Lösung mit der Extra-Row ist unpassend zum eigentlichen Problem. Wenn du
dabei bleiben willst, dann erstelle eine inverse Liste bezogen auf die
ArrayList im DataView-Objekt. Das wird aber garnatiert langsamer in der
Verarbeitung.
> Da ich aber meine ExtraRow
> nicht mitsortieren kann färbt er weiterhin Zeile 5 ein, obwohl dort
> z.B. die Ehemalige Zeile 20
> angezeigt wird.
> Deshalb brauche ich den "orginalindex".
Da eine Tabelle mit Zeilen apriori unsortiert ist, nutzt dir der
"orginalindex" überhaupt nichts. Das wirst du sofort merken, wenn du mit
Lösch- und Einfüge-Funktionen weiter arbeiten musst.
> Ich stelle mit das so vor:
> Es wird Zeile 30 angezeigt. Ich nehme Funktion GEToldIndex(30). Diese
> liefert mir dann 5 Zurück.
Wenn es so sein soll, dann bau eine eigen DAtaView-Klasse, die das als
Zusatzfunktion bietet. Mit dem Laden der ArrayList führst du eine weitere
"Index-Liste" mit, die beim Sortieren dann entsprechend "invers" mitsortiert
wird. Den Sort-Algorithmus müsstest du dann natürlich auch in deiner
privaten DataView implementieren.
> mit diesem Index gehe ich nun in meine ExtraRow und hole die Farbinfo
> Rot und die richtige Zeile
> wird eingefärbt. -
Ich empfinde diese Technologie als nicht optimal.
...
> Ich selber habe keine Sortieralgorithmus, sondern verlasse mich da auf
> Datatable, Dataview und so weiter,
> die das für mich erledigen. Um dieses "mitführen" geht es ja.
Dann schau mal auf meone Homepage, wie man eine eigene DataView-Klasse
implementieren kann:
http://ddm.xima-redaktion.de/itkb.aspx?id=111
>> Da müsstes du mal offenlegen, wie deine konkreten Klassen aussehen -
>> dein Grid, deine Sicht, dein Sortieralgorithmus usw.
> Im Prinzip recht simpel wie gesagt nur die SpaltenCollection in der
> die Rowcollection liegt (die
> aber bei vorhandener Datasource "totgelegt ist", da die Zeilen ja von
> dort kommen.
> Dann die Funktionen zum Zeichnen. Ist eine Datasource angegeben,
> dient mein Grid
> im wesentlichen nur noch zur Anzeige.
Meine Empfehlung ist nochmals: "Nutze besser das DataGrid". Das macht alles
das, was du hier beschreibst. Es selber zu realisieren, bedeutet einen
enormen konzeptionellen Aufwand, den du erst einmal bewältigen musst, um
nicht bei jeder Erweiterung an nicht vorhergesehe Situationen anstösst.
...
> Die dataview ist die Quelle, für die Daten. Nur ebend meine
> "ExtraRow" macht mir schwierigkeiten,
> da ich nicht einfach eine Spalte an die Datentabelle anhängen kann.
Warum kannst du mit Columns.Add denn keine Zusatzspalte an eine DataTable
anhängen? In dieser Zusatzspalte kannst du alle Information zur Gestaltung
der Zeile interlegen, z.B. als Fremdschlüssel auf eine Beschreibungstabelle.
Diese Zusatzspalten brauchst du nicht anzuzeigen.
Peter
- Next message: Peter Fleischer: "Re: Tabelle hinzufügen"
- Previous message: fabian meier: "Tabelle hinzufügen"
- In reply to: Jens Meyer: "Re: Datatable interer Original-Index beim Sortieren"
- Next in thread: Jens Meyer: "Re: Datatable interer Original-Index beim Sortieren"
- Reply: Jens Meyer: "Re: Datatable interer Original-Index beim Sortieren"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|
|