Najlepsze praktyki dotyczące skalowania formantu DataGridView formularzy systemu Windows

Kontrolka DataGridView została zaprojektowana w celu zapewnienia maksymalnej skalowalności. Jeśli chcesz wyświetlać duże ilości danych, postępuj zgodnie z wytycznymi opisanymi w tym temacie, aby uniknąć zużywania dużych ilości pamięci lub pogorszenia czasu odpowiedzi 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 korzystanie z automatycznego zmiany rozmiaru

  • Wydajne korzystanie z zaznaczonych kolekcji komórek, wierszy i kolumn

  • Używanie udostępnionych wierszy

  • Zapobieganie nieudostępnianiu wierszy

Jeśli masz specjalne potrzeby w zakresie wydajności, możesz zaimplementować tryb wirtualny i udostępnić własne operacje zarządzania danymi. Aby uzyskać więcej informacji, zobacz Tryby wyświetlania danych w Windows Forms DataGridView.

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 obiektach DataGridViewCellStyle . Tworzenie obiektów stylu komórki dla wielu poszczególnych DataGridView elementów może być nieefektywne, szczególnie w przypadku pracy z dużymi ilościami danych. Aby uniknąć wpływu na wydajność, należy stosować się do następujących wytycznych:

Efektywne korzystanie z menu skrótów

Każda komórka, wiersz i kolumna może mieć własne menu skrótów. Menu skrótów w kontrolce DataGridView są reprezentowane przez kontrolki ContextMenuStrip . Podobnie jak w przypadku obiektów stylu komórki, tworzenie menu skrótów dla wielu poszczególnych DataGridView elementów będzie mieć negatywny wpływ na wydajność. Aby uniknąć tej kar, należy stosować się do 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, gdy nowe wiersze są dodawane do kontrolki. Aby uzyskać maksymalną skalowalność, użyj tylko właściwości kontrolki ContextMenuStrip , aby określić pojedyncze 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ą zarządzanie obiektami menu skrótów samodzielnie, co pozwala na dostrajanie wydajności.

Efektywne używanie automatycznej zmiany rozmiaru

Rozmiar wierszy, kolumn i nagłówków może być automatycznie zmieniany wraz ze zmianami zawartości komórek, dzięki czemu cała zawartość komórek jest wyświetlana bez przycinania. Zmiana trybów zmiany rozmiaru może również zmieniać rozmiar wierszy, kolumn i nagłówków. Aby określić prawidłowy rozmiar, kontrolka DataGridView musi sprawdzić wartość każdej komórki, która musi zostać przemieszczana. Podczas pracy z dużymi zestawami danych ta analiza może mieć negatywny wpływ na wydajność kontrolki w przypadku automatycznej zmiany rozmiaru. Aby uniknąć kar za wydajność, należy stosować się do następujących wytycznych:

Aby uzyskać więcej informacji, zobacz Opcje rozmiarów w kontrolce Windows Forms DataGridView.

Wydajne korzystanie z kolekcji zaznaczonych komórek, wierszy i kolumn

Kolekcja SelectedCells nie działa wydajnie przy dużych wyborach. Kolekcje SelectedRows i SelectedColumns mogą być również nieefektywne, DataGridView chociaż w mniejszym stopniu, ponieważ istnieje o wiele mniej wierszy niż komórek w typowej kontrolce i wiele mniej kolumn niż wierszy. Aby uniknąć problemów z wydajnością podczas pracy z tymi kolekcjami, należy stosować się do następujących wytycznych:

Korzystanie z udostępnionych wierszy

Wydajne wykorzystanie 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 klasy DataGridViewRow .

Podczas udostępniania wystąpień wierszy oszczędzasz pamięć, wiersze mogą łatwo stać się nieudostępniane. Na przykład za każdym razem, gdy użytkownik bezpośrednio wchodzi w interakcję z komórką, jego wiersz staje się nieudostępniany. Ponieważ nie można tego uniknąć, wskazówki 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 ze stosunkowo małą częścią danych przy każdym uruchomieniu programu.

Wiersza nie można udostępnić w niepowiązanych DataGridView kontrolkach, jeśli którakolwiek z jej komórek zawiera wartości. DataGridView Gdy kontrolka jest powiązana z zewnętrznym źródłem danych lub gdy implementowany jest tryb wirtualny i udostępniasz własne źródło danych, wartości komórek są przechowywane poza kontrolką, a nie w obiektach komórek, co umożliwia współużytkowanie wierszy.

Obiekt wiersza można udostępnić 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ż wywnioskować ze stanu wiersza i kolumny, nie można udostępnić wiersza.

Na przykład wiersza nie można udostępnić w żadnej z następujących sytuacji:

W trybie powiązanym lub wirtualnym można udostępnić etykietki narzędzi i menu skrótów dla poszczególnych komórek, obsługą zdarzeń CellToolTipTextNeededCellContextMenuStripNeeded i .

Kontrolka DataGridView automatycznie podejmie próbę użycia udostępnionych wierszy za każdym razem, gdy wiersze zostaną dodane do tabeli DataGridViewRowCollection. Aby upewnić się, że wiersze są udostępniane, skorzystaj z poniższych wskazówek:

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

Zapobieganie nieudostępnianiu wierszy

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

Aby zapobiec nieudostępnianiu wierszy, należy stosować się do następujących wytycznych:

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

  • Jeśli musisz uzyskać dostęp do obiektu wiersza, DataGridViewRowCollection.SharedRow użyj metody i przekaż rzeczywisty indeks wiersza. Należy jednak pamiętać, że zmodyfikowanie obiektu udostępnionego wiersza pobranego za pomocą tej metody spowoduje zmodyfikowanie wszystkich wierszy, które współużytkuje ten obiekt. Wiersz dla nowych rekordów nie jest współużytkuj z innymi wierszami, więc nie będzie to mieć wpływu na modyfikowanie żadnego innego wiersza. Pamiętaj również, ż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 wystąpienia udostępnionego wiersza, GetContextMenuStrip użyj metody i przekaż rzeczywisty indeks wiersza. Jeśli zamiast tego uzyskujesz ContextMenuStrip dostęp do właściwości udostępnionego wiersza, użyje ona udostępnionego indeksu wierszy o wartości -1 i nie pobierze poprawnego menu skrótów.

  • Unikaj indeksowania kolekcji DataGridViewRow.Cells . Bezpośredni dostęp do komórki spowoduje, że jej wiersz nadrzędny stanie się nieudostępniony, co spowoduje, że zostanie utworzyć nowe .DataGridViewRow 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ępniane. Możesz również użyć właściwości CurrentCellAddress , 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 stają się nieudostępniane. Zamiast tego ustaw właściwość DataGridView.SelectionMode na lub DataGridViewSelectionMode.FullRowSelectDataGridViewSelectionMode.FullColumnSelect.

  • Nie należy obsługiwać zdarzeń DataGridViewRowCollection.CollectionChanged ani DataGridView.RowStateChanged . Te zdarzenia powodują, że wiersze stają się nieudostępniane. Ponadto nie należy wywołać metody DataGridViewRowCollection.OnCollectionChanged ani DataGridView.OnRowStateChanged , które wywołują te zdarzenia.

  • Nie należy uzyskać dostępu do DataGridView.SelectedCells kolekcji, gdy DataGridView.SelectionMode wartość właściwości to FullColumnSelect, ColumnHeaderSelect, FullRowSelectlub RowHeaderSelect. Powoduje to, że wszystkie wybrane wiersze stają się nieudostępniane.

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

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

  • Nie należy ustawiać ReadOnly właściwości lub Selected komórki na wartość , false gdy odpowiednia właściwość w kolumnie jest ustawiona na wartość true. Powoduje to, że wszystkie wiersze stają się nieudostępniane.

  • Nie należy uzyskać dostępu do DataGridViewRowCollection.List właściwości . Powoduje to, że wszystkie wiersze stają się nieudostępniane.

  • Nie należy wywołać Sort(IComparer) przeciążenia Sort metody . Sortowanie za pomocą niestandardowego porównującego powoduje, że wszystkie wiersze stają się nieudostępniane.

Zobacz też