head.WriteLine()

Dienstag, März 16, 2010

TT.DOM: Views, Teil 1

Neben der normalen Datenbindungsfunktionalität bietet TT.DOM ein View-Modell, das es ermöglicht mehrere unterschiedliche Sichten auf die selben Daten zu erstellen. So können Sie beispielsweise verschiedene Filter- und Sortierkriterien, oder Anzeigefelder je Sicht definieren.
Hierbei kommen eine Reihe von Standardinterfaces zum Einsatz, die vom jeweiligen Tabellensteuerelement zur Interaktion mit der Datenquelle verwendet werden.
View-Konzept
Eine View wird durch die Klasse DataObjectView<T> repräsentiert. Sie implementiert die folgenden Interfaces:
  • IBindingListView stellt Member für das Filtern und Sortieren bereit. Anders als bei LINQ, werden diese jedoch in Form von Zeichenketten bereitgestellt, was die dynamische Erstellung zur Laufzeit ermöglicht.
  • ITypedList wird von der Datenbindungsinfrastruktur verwendet, um die anzuzeigenden Eigenschaften der Datenquelle abzufragen. Hierzu stellt die Datenquelle PropertyDescriptor-Objekte zu Verfügung, die um Anzeigeattribute, wie DisplayName, ReadOnly oder Browsable angereichert werden können. Zudem können Sie über diesen Mechanismus berechnete Spalten bereit stellen, die dynamisch erzeugt werden und nicht in Form von Eigenschaften von der Datenklasse bereitgestellt werden müssen.
  • IListSource wird von der Listenklasse implementiert und verweist auf die Default View. Auf diese Weise wird beim Binden der Liste auf die Default View verwiesen. Dadurch wirken sich Änderungen der Default View direkt auf die Anzeige aus, auch wenn nicht explizit an diese gebunden wurde.

Views erstellen

Für den Zugriff auf eine View stellt DataObjectList<T> zwei Möglichkeiten zu Verfügung:
  1. DefaultView liefert die Standardsicht der Liste. Wie oben bereits erwähnt wird diese durch das IListSource-Interface standardmäßig bei der Binding verwendet.
  2. CreateView() erzeugt eine neue View. Auf diese Weise können Sie beliebig viele Views für die Datenquelle erstellen, wobei Änderungen der Daten – sowohl in der View, auch in der Originalliste – automatisch synchronisiert werden.
ListViewRelation

Liste sortieren

Für das Sortieren von Daten stellen alle Tabellensteuerelemente entsprechende Funktionen bereit. Es macht jedoch durchaus Sinn diese Funktionalität auch über das Objektmodell anzubieten. So müssen Sie nicht direkt mit dem Tabellensteuerelement kommunizieren, was die Kapselung der Logik und die Austauschbarkeit der Controls erhöht. Zudem stellt .NET mit dem Interface IBindingListView einen Mechanismus bereit, der eine Synchronisation zwischen der Liste und dem Anzeigesteuerelement ermöglicht. Auf diese Weise passt sich die Anzeige automatisch der programmatisch zugewiesenen Sortierung an und umgekehrt.
Die Zuweisung des Sortierkriteriums vollzieht sich bei TT.DOM nach dem gleichen Prinzip wie bei der guten, alten DataView-Klasse: Es wird eine Zeichenfolge mit den Sortierfeldern und optional “ASC” oder “DESC” für aufsteigende bzw. absteigende Reihenfolge festgelegt.
list.DefaultView.Sort = "FirstName ASC, LastName DESC";
Wie bereits erwähnt, bietet die String-basierte Zuweisung den Vorteil, diese zur Laufzeit zuweisen und ändern zu können. Auf diese Weise kann auch der Anwender von der Funktionalität profitieren. Hierfür stellt TT.DOM den Dialog SortForm bereit.
SortDialog

Filter definieren

Das Filtern der Liste erfolgt über die Filter-Eigenschaft der DataObjectView<T>-Klasse.
view.Filter = "LastName LIKE N*";
Hierbei wird der Ausdruck dynamisch via CodeDom nach C# konvertiert, kompiliert und auf die Liste angewendet. Die folgende Abbildung zeigt diesen Prozess:
Filtern
Bei der Syntax orientiert sich die Funktionalität an den Filterausdrücken, die DataView bietet. Die folgenden Ausdrücke sind hierbei möglich:
Funktion Beschreibung
Lower() Wandelt den Text in Kleinbuchstaben.
Upper() Wandelt den Text in Großbuchstaben.
Str() Wandelt einen Ausdruck in eine Zeichenfolge.
Trim() Entfernt Leerzeichen an Anfang und Ende einer Zeichenfolge.
IsNull() Gibt true zurück, wenn ein Ausdruck den Wert null enthält.
Round() Rundet eine Zahl auf eine bestimmte Anzahl an Nachkommastellen.
Date() Wandelt eine Zeichenfolge in ein Datum.
Substring() Extrahiert eine Teilzeichenfolge an der angegebenen Stelle.
Len() Gibt die Länge einer Zeichenkette zurück.
Year() Gibt das Jahr eines Datums zurück.
Month() Gibt den Monat eines Datums zurück.
Day() Gibt den Tag eines Datums zurück.
Hour() Gibt die Stunde eines Datums zurück.
Minute() Gibt die Minuten eines Datums zurück.
Second() Gibt die Sekunden eines Datums zurück.
Millisecond() Gibt die Millisekunden eines Datums zurück.
Damit auch der Benutzer von der Funktionalität profitieren kann, stellt TT.DOM zwei Standarddialoge zu Verfügung – einen für die einfache, Spalten-basierte Filterung und einen Expression Editor für Power User.
FilterColumnsDialog
FilterDialog
Ich könnte mir vorstellen den Filterprozess zukünftig durch Scripting (via dynamic in .NET 4.0) zu ersetzen. Dies würde den komplexen Konvertierungsvorgang überflüssig machen und würde zudem einen reichhaltigeren Sprachumfang bieten.
Wenn sich jemand dazu berufen fühlt, einfach bei mir melden! :)

Labels: