Laden...

Filter für Datagridview filtert nur Anzeige, aber nicht datatable

Erstellt von planetberlin vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.811 Views
planetberlin Themenstarter:in
23 Beiträge seit 2010
vor 12 Jahren
Filter für Datagridview filtert nur Anzeige, aber nicht datatable

Hallo Forum,
Um in meinem Datagrid schnell Daten (Namen) wieder zufinden, nutze ich eine simple Filterfunktion mittels Textbox und textchanged event. Sobald ich in die Textbox einige Buchstaben eingebe, kürzt sich mein Datagrid auf die Menge der Zeilen zusammen, die die Buchstaben in der Spalte "Namen" enthalten.

Das funktioniert soweit, jedoch klicke ich einen Namen an (bei "gefilterterm" datagrid) entsprechen die Daten, die ich bekomme der ursprünglichen id der datagrid auflistung.



if (textBoxFilter.Text == "")
            {
                myFilter = "";
            }
            else
            {
                myFilter = "Namen like '" + textBoxFilter.Text + "*'";
            }

ds.Tables.Add(dt);
ds.Tables[0].DefaultView.RowFilter = myFilter;


Wie kann ich es schaffen, dass nachdem ich das datagrid filtere auch die datatable real gefiltert wird (und nicht nur die anzeige)

Vielen Dank für ein paar ideen
Gruß

1.378 Beiträge seit 2006
vor 12 Jahren

Die DefaultView, deines DataTables sollte eigentlich die gefilterten Rows zur Verfügung stellen.

doch klicke ich einen Namen an (bei "gefilterterm" datagrid) entsprechen die Daten, die ich bekomme der ursprünglichen id der datagrid auflistung.

Was genau bedeutet das? Wie greifst du darauf zu? Per Index? Dann bleib wohl bei der DataView.

Lg, XXX

//Edit: Ansonsten kannst du auch über die selektierte DataGridViewRow die DataRow irgendwie rausholen was wahrscheinlich eher das ist was du brauchst?

planetberlin Themenstarter:in
23 Beiträge seit 2010
vor 12 Jahren

Ich lade mir einen Datensatz in mein Datagrid. (Bsp. 100 Stk. : Namen, Vornamen, Adressen, usw.)

Datagrid sieht dann so aus:
Spalte1 (Namen), Spalte2(Vornamen), Spalte3(...), ...

Klicke ich eine Zeile ohne Filter (sagen wir die 7. - Herr Mueller) öffne ich ein weiteres Fenster und ich lese weitere Daten aus einer anderen Tabelle einer db aus.

Tue ich das selbe, jedoch mit filter (zuvor eingabe in Textbox = mueller) reduziert sich mein datagrid. Es wird nur noch die zeile von Herrn Mueller angezeigt. Das funktioniert alles. Klicke ich jetzt diese Zeile an, werden aber die Daten des Eintrags angezeigt, die zuvor an erster Stelle meines datagrid standen.

Mir scheint, dass nachdem filtern immer noch die ursprüngliche datatable da ist, wie bekomme ich das hin, das mit dem filtern auch die datatable refresht wird???

R
158 Beiträge seit 2007
vor 12 Jahren

Die Zeilennummer des DGV (=RowId) IST nicht immer auch die gleiche Zeilennummer der zugrunde liegenden DataTable. Das DGV ist ja wie der Name bereits sagt, nur eine bestimmte Ansicht der Daten.

Um auf den richtigen datensatz der zugrunde liegenden DataTable (oder DataSource) zu kommen, um bspw. denWert einer nicht im DGV sichtbare Spalte ( z.B. ID der Adresse) zu erhalten, hilft das hier:


		private void mein DataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			DataRowView dr = meinDataGridView.CurrentRow.DataBoundItem as DataRowView;
			gesuchteID = Convert.ToInt16(dr["ID"]);
		}


Mir scheint, dass nachdem filtern immer noch die ursprüngliche datatable da ist, wie bekomme ich das hin, das mit dem filtern auch die datatable refresht wird???

Natürlich ist die ursprüngliche DataTable noch vorhanden, warum sollte die sich auch ändern? Und das Filtern refresht eigentlich nicht die DataTable als solches, sondern intern wird (vereinfacht gesagt) anhand der Filterbedingung eine DataRowCollection erstellt und diese dann dem DGV zur Ansicht weitergereicht.

Klicke ich eine Zeile ohne Filter (sagen wir die 7. - Herr Mueller) öffne ich ein weiteres Fenster und ich lese weitere Daten aus einer anderen Tabelle einer db aus. Bist Du sicher, dass es auch die RICHTIGEN Daten dieses Herrn Müller sind? Beim ersten Erstellen des DGV kann es zufälligerweise so sein, wenn nicht schon vorher programmtechnisch eine Sortierung für die Ansicht vorgenommen wurde.

werden aber die Daten des Eintrags angezeigt, die zuvor an erster Stelle meines datagrid standen. Dann holst du die Daten der anderen Tabelle anscheinend anhand der DGV-RowId (hier gleich 0). DAS kann dann ja auch nicht funktionieren 😉

F
10.010 Beiträge seit 2004
vor 12 Jahren

@planetberlin :
Sorry das zu sagen aber du solltest dringend die Grundlagen erlesen.

  1. Wenn du per DataView filterst darfst du natürlich nicht auf die Tabelle sondern nur per View drauf zugreifen.
  2. Wenn du eine BindingSource benutzt, zeigt current immer auf den aktuellen datensatz, gefiltert oder nicht.

Das mit dem DataView steht aber auch in der Hilfe/Doku zum DataView.