## 26.5 Filtern und Suchen in einer DataTable ### 26.5.1 Die Methode »Find« Wenn Sie in einer DataTable nach einer bestimmten Datenzeile suchen wollen, bietet sich die Methode Find der DataRowCollection an. Die Methode nimmt ein Objekt entgegen, das den Primärschlüssel der zu suchenden Zeile enthält. Wegen der Eindeutigkeit des Primärschlüssels ist sichergestellt, dass nur eine Zeile zurückgegeben wird. Es gibt auch eine Überladung, die ein Object-Array erwartet. Diese ist für die Tabellen gedacht, die einen Primärschlüssel aus mehreren Spalten bilden. Die Methode Find setzt voraus, dass die entsprechende Spalte auch als Primärschlüsselspalte in der DataTable bekannt ist. Dazu bietet es sich an, entweder manuell mit der Eigenschaft PrimaryKey der DataTable die Primärschlüsselspalte als solche zu kennzeichnen oder vorher die Methode FillSchema des SqlDataAdapters aufzurufen. Im folgenden Codebeispiel wird die Datenzeile mit dem Primärschlüssel 10 in der Tabelle Products gesucht.
    SqlConnection con = new SqlConnection("...");
    SqlCommand cmd = new SqlCommand("SELECT * FROM Products", con);
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.FillSchema(ds, SchemaType.Source);
    da.Fill(ds);
    // nach der Dateizeile mit PS = 10 suchen
    DataRow row = ds.Tables[0].Rows.Find(10);
    if (row == null)
      Console.WriteLine("Datenzeile nicht gefunden.");
    else
      Console.WriteLine(row["ProductName"]);
Das Beispiel einer Tabelle mit einem Primärschlüssel, der aus mehreren Spalten gebildet wird, ist die Tabelle OrderDetails der Northwind-Datenbank, in der der Primärschlüssel durch die Spalten OrderID und ProductID gebildet wird. Möchten Sie in dieser Tabelle nach einem bestimmten Datensatz suchen, müssen Sie die Find-Methode wie folgt aufrufen:
    DataRow row = ds.Tables[0].Rows.Find(new Object[]{10248,11});
### 26.5.2 Die Methode »Select« Die Find-Methode liefert nur maximal eine Datenzeile. Mit der Select-Methode lassen sich auch mehrere Datenzeilen aus einer DataTable filtern. Im Gegensatz zur Find-Methode ist Select eine Methode des DataTable-Objekts und ebenfalls mehrfach überladen. Die einfachste Version ist parameterlos und liefert alle Datenzeilen zurück, allerdings in Form eines DataRow-Arrays, beispielsweise:
    DataRow[] liste = ds.Tables[0].Select();
Eine Überladung von Select erwartet eine Zeichenfolge als Übergabeargument. Die Zeichenfolge beschreibt ein Filterkriterium, ähnlich der WHERE-Klausel in einer SQL-Abfrage, allerdings ohne WHERE. Auch hier wird die Ergebnisliste durch ein DataRow-Array gebildet. Angenommen, Sie sind an allen Artikeln interessiert, die zur CategoryID=2 gehören und einen Preis größer 20 haben, dann können Sie die Liste wie folgt bilden:
    DataTable tbl = ds.Tables[0];
    DataRow[] liste = tbl.Select("CategoryID=2 AND UnitPrice > 20");
    foreach (DataRow item in liste)
      Console.WriteLine("{0}, {1}", item["ProductName"], item["UnitPrice"]);
Die zweiparametrige Überladung der Methode können Sie im ersten Parameter das Filterkriterium angeben, im zweiten die Sortierreihenfolge. Das entspricht der ORDER BY-Klausel eines SQL-Statements, wiederum ohne ORDER BY selbst angeben zu müssen. Mit ASC und DESC können Sie auch die Sortierreihenfolge auf- und absteigend festlegen.
    DataRow[] liste = tbl.Select("CategoryID=6", "ProductName ");
Um die Datenzeilenliste ohne zu filtern zu sortieren, geben Sie im ersten Parameter null an. Die vielleicht interessanteste Überladung definiert drei Parameter: im ersten den Filter, im zweiten die Sortierung, und der dritte Parameter ist vom Typ DataViewRowState. Diese Enumeration beschreibt den Zustand der Datenzeilen, die die Ergebnismenge bilden. Beispielsweise können Sie alle als gelöscht markierten Datenzeilen in einem DataRow-Array zusammenfassen – oder alle geänderten. Da die Enumeration DataViewRowState das FlagsAttribute aufweist, lassen sich auch mehrere Enumerationsmember miteinander kombinieren. In Tabelle 26.6 sind alle Mitglieder der Enumeration aufgeführt.

Tabelle 26.6 Die Enumeration »DataViewRowState«

Member | Beschreibung
None | keine
Unchanged | unveränderte Datenzeile
Added | hinzugefügte Datenzeile
Deleted | gelöschte Datenzeile
ModifiedCurrent | aktuelle Version einer geänderten Datenzeile
ModifiedOriginal | ursprüngliche Version einer geänderten Datenzeile
OriginalRows | ursprüngliche Zeilen, einschließlich unveränderter und gelöschter Zeilen
CurrentRows | aktuelle Zeilen, einschließlich unveränderter, neuer und geänderter Zeilen
Interessieren Sie sich ausschließlich für alle gelöschten und hinzugefügten Datenzeilen einer DataTable, müssen Sie mit der folgenden Anweisung filtern:
    DataRow[] liste = tbl.Select(null, null,
                      DataViewRowState.Added | DataViewRowState.Deleted);