Nadal jest jednak problem z pobieraniem dużej ilości danych z bazy. Pobranie 2,2 mln wierszy (klient tego oczekuje :)
-
A nie możesz przekonać klienta, żeby zmienił oczekiwania?
Dane są wyświetlane na gridzie po to, żeby człowiek je oglądał. Nikt nie jest w stanie ogarnąć 2 mln wierszy.
Na pewno jest tam jakieś filtrowanie, sortowanie po stronie klienta, czyli po wczytaniu tych 2 mln. Zamień je na filtrowanie/sortowanie po stronie bazy
-
Skoro skrypt po stronie serwera wykonuje się długo to kontrolkami po stronie klienta nic z tym nie zrobisz.
Możesz jedynie zmierzyć czas poszczególnych etapów:
- wczytuję dane do pustej datatable nie podpiętej do bindingsource'a, źródło danych w datagridview null
- podłączam datatable do bindingsource'a
- podłaczam bingdinsource do dgv
PS. Piszesz o skrypcie sql i bindingsource, stąd zakładam, że dane są wczytywane z bazy i że operujesz na datasetach a nie np. EF.
Ad.1 Liczba wyświetlanych wierszy zależy od tego co się wyklika. Czasami może to być jeden wiersz a czasami kilkadziesiąt. Aby wyświetlić dużą ilość danych trzeba podjąć świadome działanie. Zwracamy na to uwagę klientowi, że jeśli będzie chciał wyświetlić dużo wierszy, to będzie musiał poczekać.
Ad.2 Zdaję sobie sprawę, że fizyki nie przeskoczymy i ogranicza nas prędkość sieci. Wydaje mi się jednak, że każdy w etapów: wczytywanie danych do datatable, podłączenie datatable do bindingsource, podłączenie bindingsource do dgv zajmuje sporo czasu. Pytając o alternatywne kontrolki chodziło mi o przyspieszenie tych etapów.
Generalnie wyświetlanie danych trwało b. długo ponieważ parametr DataGridView.ColumnHeadersHeightSizeMode był ustawiony na AutoSize. Wyłączenie tej funkcjonalności znacznie skróciło czas potrzebny na odświeżenie danych. Na razie efekt jest zadowalający.
Mam inne pytanie. W zdarzeniu DataGridView.DataBindingComplete (czyli po każdym odświeżeniu danych) wymieniane są nagłówki kolumn (DataGridView.Columns[i].HeaderCell = new NowyHeader(...)). W konstruktorze nowego nagłówka następuje podłączenie do zdarzeń grida (np DataGridView.Scroll += NowyHeader.OnScroll - zapis jest trochę uproszczony, taka jest idea). Zastanawiam się, co się dzieje ze zdarzeniami po wielokrotnym przeładowaniu DataGridView (za każdym razem są wymieniane nagłówki i podpinane nowe zdarzenia). Czy zdarzenia, z nagłówków, które zostały usunięte są w jakiś magiczny sposób usuwane z listy? Kiedy obiekt zbędnego już nagłówka zostanie zniszczony? Autor rozwiązania nie utworzył destruktora dla klasy NowyHeader, w którym jawnie można usunąć zbędne zdarzenia.