Laden...

BindingSource Filter

Erstellt von Bonaqua vor 2 Jahren Letzter Beitrag vor 2 Jahren 371 Views
B
Bonaqua Themenstarter:in
35 Beiträge seit 2011
vor 2 Jahren
BindingSource Filter

Hallo,

ich gebe meiner DataGridView als Datenquelle eine BindingSource.


dataGridView1.DataSource = bsUebersicht;

Nun soll über eine Textbox gefiltert werden können.


 private void textBox1_TextChanged(object sender, EventArgs e)
        {
            try
            {
bsUebersicht.Filter = "Nummer " + string.Format(" LIKE '%{0}%'", textBox1.Text);
}
catch {}
}

Es erscheint keine Fehlermeldung, allerdings werden auch keine Daten gefiltert.
Habe ich etwas vergessen?

P
441 Beiträge seit 2014
vor 2 Jahren

Es erscheint keine Fehlermeldung, allerdings werden auch keine Daten gefiltert.
Habe ich etwas vergessen?

Es erscheint keine Fehlermeldung, weil du eine ggf. erscheinende Unterdrückst.
Weißt du, was der Catch Block macht?

B
Bonaqua Themenstarter:in
35 Beiträge seit 2011
vor 2 Jahren

Hmm, ich bin mit dem Debugger durchgegangen und dieser hat keinen Fehler angezeigt.

B
Bonaqua Themenstarter:in
35 Beiträge seit 2011
vor 2 Jahren

Hmm, ich bin mit dem Debugger durchgegangen und dieser hat keinen Fehler angezeigt.

87 Beiträge seit 2016
vor 2 Jahren

Hallo,

hilft ein ResetBindings an der BindingSource ?

glandorf

16.827 Beiträge seit 2008
vor 2 Jahren

dieser hat keinen Fehler angezeigt.

Kann er auch nicht, so wie Du das try-catch umgesetzt hast.

4.938 Beiträge seit 2008
vor 2 Jahren

Was hast du als eigentliche DataSource (bei der BindingSource) zugewiesen?
Ist Nummer wirklich ein String-Datentyp (denn nur für diesen kannst du Textfilterung durchführen). Für Zahlentypen kannst du ansonsten nur die üblichen Vergleichsoperatoren (=, <, <=, >, >=, <>) benutzen.

PS: Die Forensoftware macht automatisch bei > bzw. < gefolgt von = ein Zeichen daraus.

B
Bonaqua Themenstarter:in
35 Beiträge seit 2011
vor 2 Jahren

Weshalb würde bei diesem try/catch kein Fehler angezeigt werden, wenn ich den Debugger verwende?

Ein ResetBindings hilft auch nicht.

Das DataSource der BindingSource habe ich eine BindingList<T>.
Die Nummer ist hier statsächlich ein String, da auch Zeichen in der Nummer enthalten sein können. (z.B. KEN-002)

4.938 Beiträge seit 2008
vor 2 Jahren

BindingSource.Filter unterstützt nur Datenquellen, welche IBindingListView (nicht zu verwechseln mit IBindingList!) implementieren - und BindingList<T> implementiert diese nicht (s.a. "Remarks" im obigen BindingSource.Filter-Artikel).

Edit: Habe online noch BindingListView gefunden (wenn du keine DataTable bzw. DataView benutzen möchtest).

T
50 Beiträge seit 2014
vor 2 Jahren

Ich nutze die Suche über die DT (ja, ne extra Spalte für jede Zeile, aber funzt sehr gut und einfach):


        private void Suchfeld_TextChanged(object sender, EventArgs e)
        {
            Suchfilter(true, Suchfeld.Text);
        }

        private void Suchfilter(bool fragment, string Suchbegriff)
        {
            dt_Geraete.DefaultView.RowFilter = string.Format("[_RowString] LIKE '%{0}%'", Suchfeld.Text);
        }

        private void Suchfeld_anlegen()
        {
            if (ColumnExistsInTable(dt_Geraete, "_RowString") == true)
                dt_Geraete.Columns.Remove("_RowString");

            DataColumn dcRowString = dt_Geraete.Columns.Add("_RowString", typeof(string));
            foreach (DataRow dataRow in dt_Geraete.Rows)
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < dt_Geraete.Columns.Count - 1; i++)
                {
                    sb.Append(dataRow[i].ToString());
                    sb.Append("\t");
                }
                dataRow[dcRowString] = sb.ToString();
            }

            SQL_GeraeteDataGrid.Columns["_RowString"].Visible = false;
        }

        private static bool ColumnExistsInTable(DataTable dataTable, string columnName)
        {
            return dataTable.Columns.IndexOf(columnName) != -1;
        }

p.s. nicht von mir..

4.938 Beiträge seit 2008
vor 2 Jahren

@Torni: Der von dir gepostete Code sucht aber über alle Spaltenwerte - und das auch noch sehr speicher- und performance-intensiv (bei jeder Werteänderung müßte dann wieder die Suchspalte neu angelegt werden) - also so nicht zu empfehlen...

Und da Bonaqua nur über eine Spalte suchen möchte, ist das also (erst recht) keine Lösung.