Filtern mit DataView (ich werd noch wahnsinnig)
-
Also irgendwie dürfte ich den Dreh noch nicht herausen haben, wie man mit DataView filtert. Folgender Code filtert nicht! In der DataView sind nach wie vor alle Rows zurück.
string filter = "street like 'elmstreet'"; DataView view = new DataView(hisDataSet1.Tables["myTable"], filter, "street", DataViewRowState.CurrentRows); int filteredItems= view.Table.Rows.Count;
Aber auch dieser Code filtert nicht:
DataView view = new DataView(hisDataSet1.Tables["myTable"]); int unfilteredItems =view.Table.Rows.Count; view.RowFilter = "street like 'elmstreet'"; view.RowStateFilter = DataViewRowState.CurrentRows; // oder muß hier noch eine Funktion aufgerufen werden // damit der filter zur Anwendung kommt? int filteredItems =view.Table.Rows.Count;
Habe ich was vergessen?
Auch die MSDN gibt kein ordentliches Beispiel, denn im Eintrag unter RowFilter ist folgender Code zu finden UND AUCH DA BLEIBEN DIE ROWS UNGEFILTERT (habs ausprobiert)
private void MakeDataView() { DataView view = new DataView(); view.Table = DataSet1.Tables["Suppliers"]; view.AllowDelete = true; view.AllowEdit = true; view.AllowNew = true; view.RowFilter = "City = 'Berlin'"; view.RowStateFilter = DataViewRowState.ModifiedCurrent; view.Sort = "CompanyName DESC"; // Simple-bind to a TextBox control Text1.DataBindings.Add("Text", view, "CompanyName"); }
-
Du kannst ja nicht im View wieder auf die Table zugreifen, da du dann wieder alle Rows zurückbekommst, ist ja irgendwie logisch, schließlich wird die Table ja nicht gefiltert, sondern es wird eine gefilterte Ansicht erstellt, und wie greift man jetzt auf diese Rows zu???, es gibt zwei Möglichkeiten entweder über den Indexer view[index] oder über den view.GetEnumerator().
-
vielleicht noch Beispiele, die du so vermisst:
static void Main(string[] args) { DataTable data = new DataTable(); data.Columns.Add("Customer", typeof(string)); data.Columns.Add("Order", typeof(int)); DataRow row = data.NewRow(); row["Customer"] = "MediaLogics"; row["Order"] = 3; data.Rows.Add(row); row = data.NewRow(); row["Customer"] = "Siemens"; row["Order"] = 2; data.Rows.Add(row); row = data.NewRow(); row["Customer"] = "Simantic"; row["Order"] = 2; data.Rows.Add(row); DataView view = new DataView(data); view.RowFilter = "Customer = 'Siemens'"; foreach (DataRowView rowView in view) { Console.WriteLine(String.Format("Customer:{0}\t\tOrder:{1}",rowView["Customer"].ToString(),rowView["Order"])); } Console.WriteLine("------------------------------------"); view = new DataView(data); view.RowFilter = "Customer like 'S*'"; for (int i=0;i <view.Count;i++) { DataRowView rowView = view[i]; Console.WriteLine(String.Format("Customer:{0}\t\tOrder:{1}", rowView["Customer"].ToString(), rowView["Order"])); } Console.WriteLine("------------------------------------"); view = new DataView(data); view.RowFilter = "LEN([Customer])>7"; IEnumerator e = view.GetEnumerator(); while(e.MoveNext()) { DataRowView rowView =e.Current as DataRowView; Console.WriteLine(String.Format("Customer:{0}\t\tOrder:{1}", rowView["Customer"].ToString(), rowView["Order"])); } Console.ReadLine(); }