Najlepsze praktyki dotyczące skalowania formantu DataGridView formularzy systemu Windows

Kontrolka została zaprojektowana DataGridView w celu zapewnienia maksymalnej skalowalności. Jeśli musisz wyświetlić duże ilości danych, należy postępować zgodnie z wytycznymi opisanymi w tym temacie, aby uniknąć zużywania dużej ilości pamięci lub obniżania czasu reakcji interfejsu użytkownika. W tym temacie omówiono następujące problemy:

  • Efektywne używanie stylów komórek

  • Wydajne korzystanie z menu skrótów

  • Efektywne zmienianie rozmiaru przy użyciu automatycznego rozmiaru

  • Efektywne używanie zaznaczonych komórek, wierszy i kolekcji kolumn

  • Korzystanie z udostępnionych wierszy

  • Uniemożliwianie udostępniania wierszy

Jeśli masz specjalne potrzeby dotyczące wydajności, możesz zaimplementować tryb wirtualny i zapewnić własne operacje zarządzania danymi. Aby uzyskać więcej informacji, zobacz Tryby wyświetlania danych w kontrolce DataGridView formularzy systemu Windows.

Efektywne używanie stylów komórek

Każda komórka, wiersz i kolumna mogą mieć własne informacje o stylu. Informacje o stylu są przechowywane w DataGridViewCellStyle obiektach. Tworzenie obiektów stylu komórki dla wielu pojedynczych DataGridView elementów może być nieefektywne, zwłaszcza podczas pracy z dużymi ilościami danych. Aby uniknąć wpływu na wydajność, skorzystaj z następujących wytycznych:

Wydajne korzystanie z menu skrótów

Każda komórka, wiersz i kolumna mogą mieć własne menu skrótów. Menu skrótów w kontrolce DataGridView są reprezentowane przez ContextMenuStrip kontrolki. Podobnie jak w przypadku obiektów stylu komórek tworzenie menu skrótów dla wielu pojedynczych DataGridView elementów negatywnie wpłynie na wydajność. Aby uniknąć tej kary, skorzystaj z następujących wytycznych:

  • Unikaj tworzenia menu skrótów dla poszczególnych komórek i wierszy. Obejmuje to szablon wiersza, który jest klonowany wraz z menu skrótów po dodaniu nowych wierszy do kontrolki. Aby uzyskać maksymalną skalowalność, użyj tylko właściwości kontrolki ContextMenuStrip , aby określić jedno menu skrótów dla całej kontrolki.

  • Jeśli potrzebujesz wielu menu skrótów dla wielu wierszy lub komórek, obsłuż zdarzenia CellContextMenuStripNeeded lub RowContextMenuStripNeeded . Te zdarzenia umożliwiają samodzielne zarządzanie obiektami menu skrótów, co pozwala dostosować wydajność.

Efektywne zmienianie rozmiaru przy użyciu automatycznego rozmiaru

Rozmiar wierszy, kolumn i nagłówków można automatycznie zmieniać, ponieważ zawartość komórki zmienia się tak, aby cała zawartość komórek została wyświetlona bez wycinania. Zmiana trybów ustalania rozmiaru może również zmieniać rozmiar wierszy, kolumn i nagłówków. Aby określić prawidłowy rozmiar, kontrolka DataGridView musi zbadać wartość każdej komórki, która musi zostać uwzględnina. Podczas pracy z dużymi zestawami danych ta analiza może negatywnie wpłynąć na wydajność kontrolki po wystąpieniu automatycznej zmiany rozmiaru. Aby uniknąć kar za wydajność, skorzystaj z następujących wytycznych:

Aby uzyskać więcej informacji, zobacz Opcje określania rozmiaru w kontrolce DataGridView formularzy systemu Windows.

Efektywne używanie zaznaczonych komórek, wierszy i kolekcji kolumn

Kolekcja SelectedCells nie działa wydajnie z dużymi wyborami. Kolekcje SelectedRows i SelectedColumns mogą być również nieefektywne, chociaż w mniejszym stopniu, ponieważ istnieje wiele mniej wierszy niż komórki w typowej DataGridView kontrolce i wiele mniej kolumn niż wiersze. Aby uniknąć kar za wydajność podczas pracy z tymi kolekcjami, skorzystaj z następujących wytycznych:

Korzystanie z udostępnionych wierszy

Efektywne użycie pamięci jest osiągane w kontrolce DataGridView za pośrednictwem udostępnionych wierszy. Wiersze będą udostępniać jak najwięcej informacji o ich wyglądzie i zachowaniu, udostępniając wystąpienia DataGridViewRow klasy.

Udostępnianie wystąpień wierszy pozwala zaoszczędzić pamięć, ale wiersze mogą łatwo stać się nieudostępne. Na przykład za każdym razem, gdy użytkownik wchodzi bezpośrednio w interakcję z komórką, jego wiersz staje się nieudostępniany. Ponieważ nie można tego uniknąć, wytyczne w tym temacie są przydatne tylko podczas pracy z bardzo dużymi ilościami danych i tylko wtedy, gdy użytkownicy będą wchodzić w interakcje z stosunkowo małą częścią danych za każdym razem, gdy program jest uruchamiany.

Nie można udostępnić wiersza w kontrolce bez ruchu przychodzącego DataGridView , jeśli którakolwiek z jego komórek zawiera wartości. Gdy kontrolka DataGridView jest powiązana z zewnętrznym źródłem danych lub podczas implementowania trybu wirtualnego i dostarczania własnego źródła danych, wartości komórek są przechowywane poza kontrolką, a nie w obiektach komórek, co pozwala na udostępnianie wierszy.

Obiekt wiersza może być współużytkowany tylko wtedy, gdy stan wszystkich jego komórek można określić na podstawie stanu wiersza i stanów kolumn zawierających komórki. Jeśli zmienisz stan komórki tak, aby nie można było go już wywieść ze stanu jego wiersza i kolumny, nie można udostępnić wiersza.

Na przykład wiersz nie może być udostępniany w żadnej z następujących sytuacji:

W trybie powiązanym lub trybie wirtualnym można podać menu Narzędzia Wskazówki i skróty dla poszczególnych komórek, obsługując zdarzenia CellToolTipTextNeeded i CellContextMenuStripNeeded .

Kontrolka DataGridView automatycznie podejmie próbę użycia udostępnionych wierszy za każdym razem, gdy wiersze zostaną dodane do elementu DataGridViewRowCollection. Skorzystaj z poniższych wskazówek, aby upewnić się, że wiersze są współużytkowane:

Aby określić, czy wiersz jest współużytkowany, użyj DataGridViewRowCollection.SharedRow metody , aby pobrać obiekt wiersza, a następnie sprawdź właściwość obiektu Index . Udostępnione wiersze zawsze mają Index wartość właściwości –1.

Zapobieganie nieudostępnianiu wierszy

Udostępnione wiersze mogą stać się nieudostępniane w wyniku akcji kodu lub użytkownika. Aby uniknąć wpływu na wydajność, należy unikać powodowania, że wiersze stają się nieudostępniane. Podczas tworzenia aplikacji można obsłużyć RowUnshared zdarzenie, aby określić, kiedy wiersze stają się nieudostępne. Jest to przydatne podczas debugowania problemów z udostępnianiem wierszy.

Aby zapobiec utracie udostępniania wierszy, skorzystaj z następujących wskazówek:

  • Unikaj indeksowania Rows kolekcji lub iterowania jej za pomocą foreach pętli. Zazwyczaj nie trzeba bezpośrednio uzyskiwać dostępu do wierszy. DataGridView metody, które działają w wierszach, przyjmują argumenty indeksu wierszy, a nie wystąpienia wierszy. Ponadto programy obsługi zdarzeń związanych z wierszami odbierają obiekty argumentów zdarzeń z właściwościami wierszy, których można użyć do manipulowania wierszami bez powodowania ich nieudostępniania.

  • Jeśli chcesz uzyskać dostęp do obiektu wiersza, użyj DataGridViewRowCollection.SharedRow metody i przekaż rzeczywisty indeks wiersza. Należy jednak pamiętać, że zmodyfikowanie udostępnionego obiektu wiersza pobranego za pomocą tej metody spowoduje zmodyfikowanie wszystkich wierszy, które współużytkują ten obiekt. Wiersz dla nowych rekordów nie jest jednak udostępniany innym wierszom, więc nie będzie to miało wpływu podczas modyfikowania żadnego innego wiersza. Należy również pamiętać, że różne wiersze reprezentowane przez udostępniony wiersz mogą mieć różne menu skrótów. Aby pobrać poprawne menu skrótów z udostępnionego wystąpienia wiersza, użyj GetContextMenuStrip metody i przekaż rzeczywisty indeks wiersza. Jeśli zamiast tego uzyskasz dostęp do właściwości wiersza ContextMenuStrip udostępnionego, użyje udostępnionego indeksu wierszy -1 i nie pobierze poprawnego menu skrótów.

  • Unikaj indeksowania kolekcji DataGridViewRow.Cells . Uzyskiwanie dostępu do komórki bezpośrednio spowoduje, że jego wiersz nadrzędny stanie się nieudostępniany, utworzenie wystąpienia nowego DataGridViewRowelementu . Programy obsługi zdarzeń związanych z komórkami odbierają obiekty argumentów zdarzeń z właściwościami komórek, których można użyć do manipulowania komórkami bez powodowania, że wiersze stają się nieudostępne. Możesz również użyć CurrentCellAddress właściwości , aby pobrać indeksy wierszy i kolumn bieżącej komórki bez bezpośredniego uzyskiwania dostępu do komórki.

  • Unikaj trybów wyboru opartych na komórkach. Te tryby powodują, że wiersze staną się nieudostępne. Zamiast tego ustaw DataGridView.SelectionMode właściwość na DataGridViewSelectionMode.FullRowSelect lub DataGridViewSelectionMode.FullColumnSelect.

  • Nie obsługujej zdarzeń DataGridViewRowCollection.CollectionChanged lub DataGridView.RowStateChanged . Te zdarzenia powodują, że wiersze staną się nieudostępne. Ponadto nie należy wywoływać DataGridViewRowCollection.OnCollectionChanged metod lub DataGridView.OnRowStateChanged , które zgłaszają te zdarzenia.

  • Nie należy uzyskiwać dostępu do kolekcji DataGridView.SelectedCells , gdy DataGridView.SelectionMode wartość właściwości to FullColumnSelect, ColumnHeaderSelect, FullRowSelectlub RowHeaderSelect. Spowoduje to, że wszystkie zaznaczone wiersze staną się nieudostępne.

  • Nie należy wywoływać DataGridView.AreAllCellsSelected metody . Ta metoda może spowodować, że wiersze staną się nieudostępne.

  • Nie należy wywoływać DataGridView.SelectAll metody , gdy DataGridView.SelectionMode wartość właściwości to CellSelect. Spowoduje to, że wszystkie wiersze staną się nieudostępne.

  • Nie należy ustawiać ReadOnly właściwości lub Selected komórki na false wartość , gdy odpowiadająca jej właściwość w kolumnie ma wartość true. Spowoduje to, że wszystkie wiersze staną się nieudostępne.

  • Nie należy uzyskiwać DataGridViewRowCollection.List dostępu do właściwości . Spowoduje to, że wszystkie wiersze staną się nieudostępne.

  • Nie należy wywoływać Sort(IComparer) przeciążenia Sort metody . Sortowanie z niestandardowym modułem porównującym powoduje, że wszystkie wiersze stają się nieudostępne.

Zobacz też