2016-06-29 6 views
0

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?

+0

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. –

Antwort

1

Unmittelbar vor dem Festlegen des Bindungsquellenfilters setzen Sie den Wert filter.Value bedingt.

Allerdings ist die flexible Filterung noch komplizierter als diese. Was ist, wenn Ihre Spalte keine Textdaten ist?

aktualisieren

statt, was ich sagte, setzen diesen Ausdruck in Ihrem Select

bs.Filter = string.Join(" AND ", 
    filters.Select(filter=>string.Format("{0} {1} '{2}'", 
    filter.ColumnName, filter.Operand, 
    filter.Operand == "like" ? "'%" + filter.Value + "%'" : filter.Value)).ToArray()); 
+0

Ich konnte das noch nicht für mich erledigen. Könnten Sie bitte angeben, wie Sie es tun würden? – Iason

+0

Ok, es war ein dummer Fehler, den ich bekam. Ich musste nur die zwei 'innerhalb der Auswertung des Ausdrucks entfernen, weil ich es bereits in' {2} 'getan hatte. – Iason