Ich erlaube dem Benutzer derzeit, durch Werte eines datagridview zu filtern, indem er den Spaltennamen, den Operanden und den Wert auswählen lässt."Contains" -Filter zur vorhandenen Liste von Filtern in datagridview hinzufügen
Spaltenname, Operand und Wert werden in einer ColumnFilter-Instanz gespeichert. Der Benutzer kann auch mehrere Filter für das Raster festlegen. Meine eigentliche Filterung funktioniert so:
public void ApplyFilters(List<ColumnFilter> filters)
{
BindingSource bs = (BindingSource)dataGridView1.DataSource;
bs.Filter = string.Join(" AND ", filters.Select(filter=>string.Format("{0} {1} '{2}'", filter.ColumnName, filter.Operand, filter.Value)).ToArray());
dataGridView1.DataSource = bs;
}
Das funktioniert gut für so viele Filter, wie Sie vielleicht anwenden möchten. Meine aktuelle Liste verfügbarer Operanden ist: {=,>, <,> =, < =, <>}. Nun möchte ich aber noch einen weiteren Operanden hinzufügen, den Enthält. Wenn also jemand eine String-Spalte durchsuchen möchte, kann er dies über diesen Operanden tun.
Eine einfache Möglichkeit zum Filtern für das Enthält ist:
var dt = (DataTable)dataGridView1.DataSource;
dt.DefaultView.RowFilter = string.Format("Column like '%{0}%'", txtBoxSearch.Text.Trim().Replace("'", "''"));
dataGridView1.DataSource = dt;
Dies ist nur ein Beispiel. Wie kann ich meine ApplyFilters-Funktion generisch genug machen, um den Contains-Operanden zu berücksichtigen?
Könnten Sie verwenden eine stark typisierte Sammlung von Objekten anstelle eines 'DataTable' als Datenquelle ? Dann wäre es möglich, mit LINQ zu filtern. –