Autor Wątek: DataGridView + BindingSource.Filter  (Przeczytany 2459 razy)

Offline baranek

  • Użytkownik

# Listopad 18, 2010, 09:01:59
Witam,

Od wczoraj męczę jeden problem. Stworzyłem pewien program w którym użytkownik musi wyszukiwać po bazie kontrahentów. Tablica kontrahentów aktualnie ma >61000 rekordów i z dnia na dzień rośnie. Program mniej więcej wygląda tak:



Wszystko działa ok w filtrze w jedną stronę.  Jeśli użytkownik wpiszę powiedzmy w polu ulica: 'Mat', to ładnie i szybko program filtruje wszystkich kontrahentów z ulicą rozpoczynającą się na Mat. Problem pojawia się w momencie gdy użytkownik wyczyści pole ulica i filtr jest zerowany, wtedy przywrócenie wszystkich danych w DataGridView  trwa długo. Mimo iż jest to operacja trwająca około 10 sekund, to jednak jest to za długi okres dla użytkownika, znacznie utrudniający mu pracę. Tak wygląda obsługa filtra:
        private void vUlica_TextChanged(object sender, EventArgs e)
        {
            if (vUlica.Text.Length > 0)
            {
                bsKontrahent.Filter = "PK_MIASTO LIKE '%" + vMiasto.Text + "%'";
            }
            else
            {
                bsKontrahent.RemoveFilter(); //ta operacja trwa długo
            }
        }

Czy jest jakieś sensowne rozwiązanie tego problemu? Wszystko działa ok dla małej ilości danych...

B.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Listopad 18, 2010, 15:09:18
Cały czas w pamięci przechowujesz listę wszystkich, a przy filtrowaniu podmieniasz listę do wyświetlenia na przefiltrowaną. Po wyczyszczeniu pól podmieniasz ją na oryginalną.

Offline baranek

  • Użytkownik

# Listopad 18, 2010, 20:01:31
Robiłem tak. Miałem dwa DataView do tego DataTable które filtruje. Jedno było stałe, nie zmieniało się, drugie się filtrowało i podmieniałem w zależności od tego czy były pola puste czy nie. Niestety poprawiło się tylko w niewielkim stopniu. Rozważam jedno rozwiązanie, jutro sprawdzę jak to zadziała tzn. będę miał dwa gridy i w zależności co się dzieje będe jednego ukrywał, drugiego pokazywał. Ale myślałem, iż są bardziej eleganckie sposoby.
« Ostatnia zmiana: Listopad 18, 2010, 20:04:48 wysłana przez baranek »

Offline baranek

  • Użytkownik

# Listopad 19, 2010, 13:36:15
Problem rozwiązany. Miałem ustawione automatyczne ustawianie szerokości kolumn. Przy stałej szerokości wszystko działa ładnie i szybko.