12.7 DataViews verwenden
 
Ein DataView-Objekt stellt eine individuell angepasste Ansicht eines DataTable-Objektes zur Verfügung. Mit einem DataView-Objekt können Sie die Daten einer Tabelle filtern, sortieren, durchsuchen und bearbeiten. Ein DataView-Objekt können Sie an ein Steuerelement binden.
12.7.1 Tabellen sortieren
 
In Abschnitt 12.15, Das Zusammenspiel von Command, Adapter und DataSet, haben Sie alle Versandfirmen ausgegeben. Wenn Sie die Ausgabe alphabetisch nach Firmenname sortieren möchten, dann gehen Sie so vor:
1. Erstellen Sie ein DataView-Objekt.
Dim alpha As DataView
2. Weisen Sie dem DataView-Objekt die Basistabelle zu.
alpha = New DataView(myDS.Tables(0))
3. Weisen Sie der Sort-Eigenschaft den gewünschten Sortierausdruck zu.
alpha.Sort ="Firma ASC"
4. Binden Sie das DataView-Objekt an das Steuerelement.
myGrid.DataSource = alpha
DataBind()
Der Eigenschaft Sort des DataView-Objekts weisen Sie den gewünschten Sortierausdruck zu. Im Prinzip entspricht dieser Teil dem ORDER-BY-Anteil eines entsprechenden SQL-Befehls.
5. Abbildung 12.16 zeigt die sortierte Tabelle im Browser.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 12.15 Mit dem DataView-Objekt können Sie Tabellen sortieren, filtern und durchsuchen.
12.7.2 Tabellen nach Inhalten filtern
 
So, wie Sie mit der Sort-Eigenschaft die Daten sortieren, können Sie über die RowFilter-Eigenschaft die Daten filtern. Natürlich können Sie auch beides miteinander verbinden. Alle Versandfirmen, deren Telefonnummer mit (503) anfängt, erreichen Sie über diesen Ausdruck:
alpha.RowFilter = "Telefon LIKE '(503)%'"
Die Angabe für die Eigenschaft RowFilter entspricht dem WHERE-Anteil eines SQL-Befehls. Als Platzhalterzeichen ist übrigens neben dem SQL-typischen % auch das * erlaubt. Zum Erfolg führt also auch dieser Ausdruck:
alpha.RowFilter = "Telefon LIKE '(503)*'"
Hier einige weitere Beispiele. Alle Versandfirmen mit einer Firmen-Nr. größer als 2 erreichen Sie mit diesem Ausdruck (db_13.aspx):
alpha.RowFilter = "[Firmen-Nr] > 2"
| Achtung Dabei müssen Sie darauf achten, das Feld Firmen-Nr in eckige Klammern einzuschließen. Der Bindestrich im Feldnamen würde sonst falsch ausgewertet werden.
|
Datumsangaben setzen Sie zwischen Doppelkreuze und verwenden die englische Datumsdarstellung MM/TT/JJJJ. Sie haben beispielsweise ein DataTable-Objekt mit diesem SQL-Ausdruck erstellt:
SELECT Bestelldatum, Empfänger FROM Bestellungen".
Wenn Sie alle Bestellungen vom November 1996 in chronologischer Reihenfolge darstellen wollen, verwenden Sie diese beiden Zuweisungen:
alpha.Sort ="Bestelldatum ASC"
alpha.RowFilter = "Bestelldatum >= #12/01/1996# AND Bestelldatum <=#12/31/1996#"
12.7.3 Nach dem Zeilenstatus filtern
 
Sie können Tabellen auch nach dem Zeilenstatus selektieren. Damit sind Abfragen folgender Art möglich: »Zeige mir alle Zeilen, die verändert/hinzugefügt/als gelöscht markiert/etc. wurden«. Hierfür verwenden Sie die Eigenschaft RowStateFilter. Die Enumeration DataViewRowState definiert die zulässigen Werte:
|
Added die hinzugefügten Zeilen, |
|
CurrentRows die aktuellen Zeilen, |
|
Deleted die gelöschten Zeilen, |
|
ModifiedCurrent die geänderten Zeilen in der geänderten Form, |
|
ModifiedOriginal die ursprüngliche Form der geänderten Zeilen, |
|
None keine Zeilen, |
|
OriginalRows die Zeilen in der Originalversion, |
|
Unchanged die unveränderten Zeilen. |
Der folgende Ausdruck selektiert beispielsweise die hinzugefügten Zeilen:
myView.RowStateFilter = DataViewRowState.Added
Mit dem booleschen Operator OR können Sie mehrere Angaben miteinander kombinieren.
12.7.4 In Tabellen suchen
 
»Gibt es Zeilen, die diesen und jenen Bedingungen entsprechen? Wenn ja, wo finde ich die erste passende Zeile? Zeige mir alle Treffer!« Für Anfragen dieser Art eignen sich die Find- und die FindRows-Methode. Find kann Ihnen sagen, ob es überhaupt entsprechende Zeilen gibt. Wenn ja, erhalten Sie die Indexposition des ersten passenden Datensatzes. Die FindRows-Methode liefert alle passenden Zeilen selbst in Form eines Arrays aus DataRowView-Objekten. Vorbedingung für die Verwendung beider Methoden ist, dass das DataView-Objekt nach dem Feld beziehungsweise nach den Feldern sortiert ist, in dem beziehungsweise in denen gesucht wird.
Gibt es Bestellungen vom 5.12.1996? So suchen Sie nach passenden Einträgen:
1. Erstellen Sie ein DataView-Objekt von der Tabelle Bestellungen.
Dim dv As DataView
dv = New DataView(myDS.Tables(0))
2. Sortieren Sie die Tabelle Bestellungen nach dem Bestelldatum.
dv.Sort ="Bestelldatum ASC"
3. Rufen Sie die Find-Methode mit dem gesuchten Datum auf.
Dim suchDatum As Date = #12/05/1996#
Dim erg As Integer
erg = dv.Find (suchDatum)
Wenn erg -1 zurückgibt, gibt es keine passenden Datensätze. Andernfalls enthält erg die Indexposition des ersten passenden Eintrags.
Falls Ihnen der erste passende Eintrag ausreicht, können Sie mit der Indexposition direkt auf den gefundenen Datensatz zugreifen. So lesen Sie beispielsweise das Feld Empfänger des gefundenen Datensatzes aus:
dv(erg)("Empfänger")
Wenn Sie das Feld im Rahmen von String-Operationen verwenden, müssen Sie es erst noch in den Datentyp String konvertieren, etwa so:
dv(erg)("Empfänger").toString()
Falls Sie alle Treffer benötigen, müssen Sie noch FindRows aufrufen. FindRows liefert die Ergebnismenge als Array aus DataRowView-Objekten. Dieses Array können Sie als Datenquelle für ein DataGrid-Steuerelement angeben:
Dim drv As DataRowView()
drv = dv.FindRows (suchDatum)
myGrid.DataSource = drv
myGrid.DataBind()
db_15.aspx fasst diese Suchschritte zusammen. Abbildung 12.16 zeigt die Darstellung im Browser.
' ...
' DataView erstellen
Dim dv As DataView
dv = New DataView(myDS.Tables(0))
' DataView nach der Spalte sortieren, in der
' gesucht werden soll
dv.Sort ="Bestelldatum ASC"
' Feststellen, ob es passende Einträge gibt.
Dim suchDatum As Date = (#12/05/1996#)
Dim erg As Integer
erg = dv.Find (suchDatum)
' Suchergebnis ausgeben
Dim sb As New StringBuilder
sb.Append("Gibt es Bestellungen vom ")
sb.Append(CStr (suchDatum) & "?<br>")
If erg = -1 Then
sb.Append ("Es gibt keine passenden Datensätze")
Else
sb.Append("Es gibt passende Datensätze. <br>")
sb.Append("Der erste passende Datensatze hat ")
sb.Append("die Indexposition: " & CStr(erg))
' Passende Datensätze anzeigen
Dim drv As DataRowView()
drv = dv.FindRows (suchDatum)
myGrid.DataSource = drv
myGrid.DataBind()
End If
ausgabe.innerHTML = sb.toString()
' ...
 Hier klicken, um das Bild zu Vergrößern
Abbildung 12.16 Die Methoden Find und FindRows ermöglichen das gezielte Suchen in DataView-Objekten.
| Konstruktoren
|
New()
New(DataTable)
New(DataTable, String, String, DataViewRowState)
|
Neben dem DataTable können RowFilter, Sort und DataViewRowState dem Konstruktor übergeben werden.
|
| Eigenschaften
|
| AllowDelete
|
Boolean
|
True, wenn Löschen erlaubt ist
|
| AllowEdit
|
Boolean
|
True, wenn Bearbeiten erlaubt ist
|
| AllowNew
|
Boolean
|
True, wenn mit AddNew neue Zeilen hinzugefügt werden dürfen
|
| ApplyDefaultSort
|
Boolean
|
True, wenn die Standardsortierung verwendet werden soll
|
| Count
|
Integer
|
Anzahl der Datensätze nach Anwendung von RowFilter und RowStateFilter
|
| DataViewManager
|
DataViewManager
|
Der zugeordnete DataViewManager
|
| Item(Integer)
|
DataRowView
|
Standardeigenschaft. Die über die Ordnungszahl definierte Zeile
|
| RowFilter
|
String
|
Filterausdruck. Entspricht weit gehend dem WHERE-Ausdruck eines SQL-Statements
|
| RowStateFilter
|
DataViewRowState
|
Selektiert die Zeilen nach ihrem Status. Mögliche Werte der Enumeration DataViewRowState sind: Added, CurrentRows, Deleted, ModifiedCurrent, ModifiedOriginal, None, OriginalRows, Unchanged.
|
| Sort
|
String
|
Sortierausdruck. Entspricht der ORDER-BY-Klausel eines SQL-Statements
|
| Table
|
DataTable
|
Die zugrunde liegende Tabelle
|
| Methoden
|
| AddNew()
|
DataRowView
|
Fügt der DataView eine neue Zeile hinzu
|
| Delete(Integer)
|
|
Löscht eine Zeile
|
Find(Object)
Find(Object())
|
Integer
|
Sucht eine Zeile anhand des Sortierschlüsselwertes. Die DataView muss nach der Spalte, in der gesucht wird, sortiert sein.
|
FindRows(Object)
FindRows(Object())
|
DataRowView()
|
Liefert ein Array von DataRowView-Objekten, deren Spalten dem Sortierschlüsselwert entsprechen
|
| GetEnumerator()
|
IEnumerator
|
Ein Enumerator für dieses DataView
|
Tabelle 12.9 Steckbrief der Klasse DataView
|