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?
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?
Hmm, ich bin mit dem Debugger durchgegangen und dieser hat keinen Fehler angezeigt.
Hmm, ich bin mit dem Debugger durchgegangen und dieser hat keinen Fehler angezeigt.
Hallo,
hilft ein ResetBindings an der BindingSource ?
glandorf
dieser hat keinen Fehler angezeigt.
Kann er auch nicht, so wie Du das try-catch umgesetzt hast.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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)
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).
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..
@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.