Dane możemy pobrać wygodnie np za pomocą SQLDataAdaptera do DataTable lub DataSet, a następnie przerzucić na nasz dataGrid.
Jeśli chcemy filtrować zbiór, możemy zrealizować to na wiele sposobów, m.in.:
- Za każdym razem pobierać "świeże", przefiltrowane dane z bazy - tylko wtedy dodatkowo obciążamy system, a w chwili kiedy pobieramy dane z dość statecznego zbioru (np słownika), nie zawsze będzie to "eleganckie" rozwiązanie.
- Filtrować dane w naszej kolekcji (np DataTable, Combobox, DataGridView, etc) - wszystko fajnie, ale musimy to ręcznie oprogramować, co bywa męczące, a w dodatku możemy być gorsi z algorytmów, ale dobrzy z SQL'a... co wtedy?
Jedno i drugie rozwiązanie jest jak najbardziej akceptowalne (zależnie oczywiście od sytuacji). Natomiast mimo wszystko, fajnym wynalazkiem jest DataView.
System.Data.DataView
DataView osobiście nazywam "nakładką" na zbiór danych (sam w sobie nie przechowuje danych). Umożliwia m.in. sortowanie, edycję wyszukiwanie/filtrowanie, etc (więcej informacji pod tym linkiem ) W artykule opowiem trochę o filtrowaniu (oczywiście na przykładzie) :)Zastosowanie:
- Pobranie kompletu danych (czasami działa szybciej niż przy przefiltrowanych zbiorach - o tym również wspomnę :) )
- upakowanie danych naszym DataView (amulet szczęścia :) )
- Filtrowanie danych po stronie klienta (Serwer odpoczywa)
Koniec teorii, czas na praktykę.
załóżmy, że mamy prostą tabelkęDo pobrania danych (wszystkich) stworzyliśmy sobie procedurę SQL:
getServerList
w aplikacji pobraliśmy sobie dane i "wrzuciliśmy" do datagrida:
private void GetServers()
{
SqlConnection con = new SqlConnection(/*nasz ConnectionString*/);
SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("exec getServerList", con);
DataTable dt = new DataTable();
//wypełniamy DataTable danymi za pomocą metody Fill:
da.Fill(dt);
//wypełniamy (wskazujemy źródło) naszym dataTable
dataGridView1.DataSource=dt;
}
Działa, pobraliśmy dane. Ale chcielibyśmy móc filtrować wyniki po miejscowości i obsłużmy zdarzenie
Dodajemy Textbox, po drodze dorzucamy DataView i metodę do obsługi filtrowania i obsługujemy zdarzenie na TextChanged...
DataView dataViewServers;
private void GetServers()
{
SqlConnection con = new SqlConnection(/*nasz ConnectionString*/);
SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("exec getServerList", con);
DataTable dt = new DataTable();
da.Fill(dt);
//upakujmy nasz zbiór danych DataView...
dataViewServers = new DataView(dt);
//...i podłączmy DataView zamiast DataTable dataGridView1.DataSource=dataViewServers;
}
//utwórzmy dla porządku metodę odpowiedzialną za filtrowanie
private void FilterServers()
{
//filtrowanie jak w SQL...
dataViewServers.RowFilter = "Location_City like '"+textBoxCity.Text+"%'";
}
//obsłużymy zdarzenie naszego textboxa, aby filtrowało "na żywo":
private void textBoxCity.TextChanged(object sender, EventArgs e)
{
filterServers();
}
Rezultat: mamy bardzo fajną, szybką i dynamiczną wyszukiwarkę. przy czym samo wyszukiwanie odbywa się po stronie aplikacji - operując na pobranej już kolekcji. Zawsze możemy dodać kolejne warunki do filtrowania danych.
Brak komentarzy:
Prześlij komentarz