Laden...

BindingSource.Filter

Erstellt von pringels vor 17 Jahren Letzter Beitrag vor 17 Jahren 5.350 Views
P
pringels Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren
BindingSource.Filter

Hallo,
ich habe in einer Form ein Datagridview, welches gefiltert werden kann:

 
meineBindingSource.DataSource=meineDataTable;
...
meineBindingSource.Filter= "Name LIKE '%" + txtFieldName.Text +"%'";

Das funzt auch super 🙂

Nun hat die Sache aber einen Schönheitsfehler.
Ich soll es hinbekommen, das z.B. Punkte bei Abkürzungen ignoriert werden.
Kleines Beispiel:
Wenn der Nutzer ins Textfeld "Prof Dr Meier" (ohne Punkte) einträgt, soll auch "Prof. Dr. Meier" (mit Punkte) mit erscheinen.

Kann mir jemand sagen, wie ich dafür einen Filter formulieren kann.

Vielen Dank...

563 Beiträge seit 2004
vor 17 Jahren

Hallo Pringels

Eine Möglichkeit wäre die . durch ein ? zu ersetzen

.unreal

D
45 Beiträge seit 2006
vor 17 Jahren

Hallo!

Ich hab ein ganz ähnliches Problem. Wollte ich mein DataGridView nach einem Namen oder so filtern, dann wäre das hiermit ja schon gelöst.

Aber mein zu filterndes DGV enthält eine Spalte mit Datum. Dazu habe ich eine Combobox, in der die Benutzer alle Datum der Tabelle aufgelistet bekommen (Die Tabelle als DataSource der ComboBox). Nun kann der Benutzer ein Datum auswählen und ich will die DataGridView nach diesem Datum filtern.

Wie müsste denn ein entsprechender Ausdruck für den BindingSourceFilter in dem Fall aussehen?!

LIKE kann man nicht auf DateTime und String anwenden. Hab dann DateTime.Parse.comboBox.SelectetText) probiert, geht aber auch nicht.

Hat jemand ne Idee?

MfG
Der Schnapper

J
3.331 Beiträge seit 2006
vor 17 Jahren

Müsste nicht die Prüfung auf Gleichheit funktionieren? In der Hoffnung, dass der Filter automatisch Date(Time) benutzt...

Es könnte sein, dass der Unterschied zwischen einem Datum und einer DateTime-Variable Probleme verursacht. Dann könnte ein berechnetes Zusatzfeld helfen, das ein genaues Datum (mit der Uhrzeit 00:00:00) enthält.

Viel Erfolg! Jürgen

D
45 Beiträge seit 2006
vor 17 Jahren

Tja, selbst wenn man den Filter "hart codiert" setzt und dann im String Filter "Datum = 2.12.2006" steht...

dann kommt ne Exception
das Token '.' an der Position 13 wurde nicht erkannt.

Ich bin ratlos!

Könnte man auch irgendwie den Datentyp der Spalte im Filter umgehen indem man ein Stringliteral des Spaltenwertes bekommt? Wie könnte man das machen, wenn überhaupt?!

MfG
Der Schnapper

A
72 Beiträge seit 2006
vor 17 Jahren

dann prüfe halt auf mehrere strings.
quasi

if(deinfeld.contains("1.1.1001") || deinfeld.contains("01.1.1001") || USW.)
{
     mach das und das
}

gruß

apollo

J
3.331 Beiträge seit 2006
vor 17 Jahren

Original von DerSchnapper
Tja, selbst wenn man den Filter "hart codiert" setzt und dann im String Filter "Datum = 2.12.2006" steht...

Der Vergleichswert muss dann vermutlich als String eingetragen werden:

BindingSource1.Filter = "Datum = '2.12.2006'";

Sonst kann er vermutlich nicht als String erkannt werden. Siehe das Beispiel in der NET-Doku unter BindingSource.Filter-Eigenschaft:

BindingSource1.Filter = "ContactTitle='Owner'";

Viel Erfolg! Jürgen

D
45 Beiträge seit 2006
vor 17 Jahren

kapier ich jetzt nicht so wirklich. Gibts denn keine andere möglichkeit, das DataGridView zu filtern?
Ich könnte ja an der Stelle auch eine Connection auf die DB-Tabelle machen und mit ein Select-Statement basteln und anwenden. Das Ergebnis wäre dann ein DataReader. Nur wie würde ich dann den Inhalt des DataReader in das dgv bekommen? grübel...

@Jürgen:
Ja, das Beispiel hab ich schon gesehen und das dann auch so angewendet. Leider ohne Erfolg irgendwie...

bzw: Danach hatte ich dann nur noch das Datum zur Wahl, auf das ich gefiltert hab. Scheinbar ist die BindingSource nun gefiltert. Wie stelle ich jetzt nur die gefilterte Tabelle in dem dgv dar?

MfG
Der Schnapper

J
3.331 Beiträge seit 2006
vor 17 Jahren

Original von DerSchnapper
Wie stelle ich jetzt nur die gefilterte Tabelle in dem dgv dar?

Eben genau dadurch, dass das DataGridView als DataSource eben anstelle der Tabelle die gefilterte Quelle erhält - siehe das Doku-Beispiel:

// Set the data source for dataGridView1 to BindingSource1.
dataGridView1.DataSource = BindingSource1;

Jürgen

D
45 Beiträge seit 2006
vor 17 Jahren

Ah, ok!

Und wenn man nun wieder was im dgv ändert und dann speichert, dann ist die tatsache, dass die bindingsource gefiltert ist, aber kein problem? Die Datensatze, die in der bs dann eben herausgefiltert sind in dem Moment werden dann in der Tabelle nicht beeinflusst oder gar gelöscht?

MfG
Der Schnapper

J
3.331 Beiträge seit 2006
vor 17 Jahren

++Selbst versuchen!++1.NET-Doku: BindingSource-Klasse alle Member aufrufen 1.durchlesen, welche Eigenschaften oder Methoden helfen könnten 1.nanu, was macht denn wohl BindingSource.ResetBindings-Methode?

Führt dazu, dass in ein an BindingSource gebundenes Steuerelement alle Elemente in der Liste erneut eingelesen und ihre angezeigten Werte aktualisiert werden.

1.Programmtext aus dem Beispiel übernehmen 1.Ausprobieren!

Jürgen

D
45 Beiträge seit 2006
vor 17 Jahren

Entschuldigt bitte, aber wenn ich aus der doku schlau geworden wäre, hätte ich nicht gefragt.
Nicht jeder Entwickler ist gleich gut bei so was, ich musste eben leider auf die Erfahrung anderer Leute zurückgreifen.

Ich ziehe mich jetzt zurück und übe gaaaanz viel, um viel viel besser zu werden und alles verstehen zu können.

MfG
Der Schnapper

J
3.331 Beiträge seit 2006
vor 17 Jahren

Original von DerSchnapper
Entschuldigt bitte, aber wenn ich aus der doku schlau geworden wäre, hätte ich nicht gefragt.
Nicht jeder Entwickler ist gleich gut bei so was, ich musste eben leider auf die Erfahrung anderer Leute zurückgreifen.

Ich ziehe mich jetzt zurück und übe gaaaanz viel, um viel viel besser zu werden und alles verstehen zu können.

Auch wenn Du Dich "DerSchnapper" nennst, sollst Du nicht eingeschnappt sein: Wenn ich über Deine Frage entrüstet gewesen wäre, hätte ich Dir die Quelle ohne jeden Kommentar hingeschmissen und Dich wirklich alleine gelassen.

Ich muss (ebenfalls?) alleine lernen und muss genauso vorgehen, wie ich es Punkt für Punkt aufgeführt habe. Auf diese Weise habe ich vieles selbst entdeckt; und das wollte ich Dir als allgemeinen Ratschlag mitgeben.

Nicht sauer sein! Jürgen