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:
Unikaj ustawiania właściwości stylu komórki dla poszczególnych DataGridViewCell obiektów lub DataGridViewRow obiektów. Obejmuje to obiekt wiersza określony przez RowTemplate właściwość . Każdy nowy wiersz sklonowany z szablonu wiersza otrzyma własną kopię obiektu stylu komórki szablonu. Aby uzyskać maksymalną skalowalność, ustaw właściwości stylu komórki na DataGridView poziomie. Na przykład ustaw DataGridView.DefaultCellStyle właściwość zamiast DataGridViewCell.Style właściwości .
Jeśli niektóre komórki wymagają formatowania innego niż domyślne formatowanie, użyj tego samego DataGridViewCellStyle wystąpienia w grupach komórek, wierszy lub kolumn. Unikaj bezpośredniego ustawiania właściwości typu DataGridViewCellStyle dla poszczególnych komórek, wierszy i kolumn. Przykład udostępniania stylów komórek można znaleźć w temacie How to: Set Default Cell Styles for the Windows Forms DataGridView Control (Instrukcje: ustawianie domyślnych stylów komórek dla kontrolki DataGridView formularzy systemu Windows). Można również uniknąć kary wydajności podczas ustawiania stylów komórek indywidualnie, obsługując procedurę CellFormatting obsługi zdarzeń. Przykład można znaleźć w temacie How to: Customize Data Formatting in the Windows Forms DataGridView Control (Instrukcje: dostosowywanie formatowania danych w kontrolce DataGridView formularzy systemu Windows).
Podczas określania stylu komórki użyj DataGridViewCell.InheritedStyle właściwości, a nie DataGridViewCell.Style właściwości . Uzyskiwanie Style dostępu do właściwości powoduje utworzenie nowego wystąpienia DataGridViewCellStyle klasy, jeśli właściwość nie została jeszcze użyta. Ponadto ten obiekt może nie zawierać pełnych informacji o stylu komórki, jeśli niektóre style są dziedziczone z wiersza, kolumny lub kontrolki. Aby uzyskać więcej informacji na temat dziedziczenia stylu komórek, zobacz Style komórek w kontrolce DataGridView formularzy systemu Windows.
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:
Unikaj automatycznego określania rozmiaru kontrolki DataGridView z dużym zestawem wierszy. Jeśli używasz automatycznego określania rozmiaru, zmień rozmiar tylko na podstawie wyświetlanych wierszy. Używaj również tylko wyświetlanych wierszy w trybie wirtualnym.
W przypadku wierszy i kolumn użyj
DisplayedCells
pola DataGridViewAutoSizeRowsModelubDisplayedCellsExceptHeaders
wyliczenia , DataGridViewAutoSizeColumnsModei DataGridViewAutoSizeColumnMode .W przypadku nagłówków wierszy użyj AutoSizeToDisplayedHeaders pola DataGridViewRowHeadersWidthSizeMode lub AutoSizeToFirstHeader wyliczenia.
Aby uzyskać maksymalną skalowalność, wyłącz automatyczne ustalanie rozmiaru i użyj programowego zmiany rozmiaru.
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:
Aby określić, czy wszystkie komórki w obiekcie DataGridView zostały wybrane przed uzyskaniem dostępu do zawartości SelectedCells kolekcji, sprawdź wartość AreAllCellsSelected zwracaną metody. Należy jednak pamiętać, że ta metoda może spowodować, że wiersze staną się nieudostępne. Aby uzyskać więcej informacji, zapoznaj się z następną sekcją.
Unikaj używania Count właściwości , System.Windows.Forms.DataGridViewSelectedCellCollection aby określić liczbę zaznaczonych komórek. Zamiast tego użyj DataGridView.GetCellCount metody i przekaż DataGridViewElementStates.Selected wartość . Podobnie użyj DataGridViewRowCollection.GetRowCount metod i DataGridViewColumnCollection.GetColumnCount , aby określić liczbę wybranych elementów, zamiast uzyskiwać dostęp do wybranych kolekcji wierszy i kolumn.
Unikaj trybów wyboru opartych na komórkach. Zamiast tego ustaw DataGridView.SelectionMode właściwość na DataGridViewSelectionMode.FullRowSelect lub DataGridViewSelectionMode.FullColumnSelect.
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:
Wiersz zawiera pojedynczą wybraną komórkę, która nie znajduje się w wybranej kolumnie.
Wiersz zawiera komórkę z jej ToolTipText zestawem właściwości lub ContextMenuStrip .
Wiersz zawiera element DataGridViewComboBoxCell z jego Items zestawem właściwości.
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:
Unikaj wywoływania
Add(Object[])
przeciążenia Add metody iInsert(Object[])
przeciążenia Insert metody kolekcji DataGridView.Rows . Te przeciążenia automatycznie tworzą nieudostępniane wiersze.Upewnij się, że wiersz określony we DataGridView.RowTemplate właściwości może być współużytkowany w następujących przypadkach:
Podczas wywoływania
Add()
przeciążeń Add metody lubAdd(Int32)
Insert(Int32,Int32)
przeciążenia Insert metody kolekcjiDataGridView.Rows.Podczas zwiększania DataGridView.RowCount wartości właściwości.
Podczas ustawiania DataGridView.DataSource właściwości.
Upewnij się, że wiersz wskazany przez
indexSource
parametr można udostępnić podczas wywoływania AddCopymetod DataGridView.Rows , AddCopies, InsertCopyi InsertCopies kolekcji.Upewnij się, że określony wiersz lub wiersze mogą być współużytkowane podczas wywoływania
Add(DataGridViewRow)
przeciążenia Add metody, AddRange metody,Insert(Int32,DataGridViewRow)
przeciążenia Insert metody i InsertRange metody DataGridView.Rows kolekcji.
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ż
- DataGridView
- Dostrajanie wydajności w kontrolce DataGridView formularzy Windows Forms
- Tryb wirtualny w kontrolce DataGridView formularzy Windows Forms
- Tryby wyświetlania danych w kontrolce DataGridView formularzy Windows Forms
- Style komórki w kontrolce DataGridView formularzy Windows Forms
- Instrukcje: ustawianie domyślnych stylów komórki dla kontrolki DataGridView formularzy Windows Forms
- Opcje ustalania rozmiaru w kontrolce DataGridView formularzy Windows Forms
.NET Desktop feedback
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla