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:
Unikaj ustawiania właściwości stylu komórki dla poszczególnych obiektów DataGridViewCell lub DataGridViewRow . Obejmuje to obiekt wiersza określony przez właściwość RowTemplate . 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 poziomie DataGridView . Na przykład ustaw właściwość DataGridView.DefaultCellStyle , a nie DataGridViewCell.Style właściwość .
Jeśli niektóre komórki wymagają formatowania innego niż formatowanie domyślne, użyj tego samego DataGridViewCellStyle wystąpienia w grupach komórek, wierszy lub kolumn. Unikaj bezpośredniego ustawiania właściwości typu dla DataGridViewCellStyle poszczególnych komórek, wierszy i kolumn. Aby uzyskać przykład udostępniania stylu komórki, zobacz How to: Set Default Cell Styles for the Windows Forms DataGridView (Jak ustawić domyślne style komórki dla kontrolki DataGridView). Można również uniknąć kar za wydajność, ustawiając style komórki indywidualnie, obsługą procedury obsługi CellFormatting zdarzeń. Aby uzyskać przykład, zobacz How to: Customize Data Formatting in the Windows Forms DataGridView Control (Jak dostosować formatowanie danych Windows Forms DataGridView).
Podczas określania stylu komórki użyj właściwości DataGridViewCell.InheritedStyle , a nie DataGridViewCell.Style właściwości . Uzyskanie dostępu do Style właściwości powoduje utworzenie nowego wystąpienia klasy DataGridViewCellStyle , 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órki, zobacz Style komórki w Windows Forms DataGridView.
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:
Unikaj używania automatycznego rozmiaru w kontrolce DataGridView z dużym zestawem wierszy. Jeśli używasz automatycznego zmieniania rozmiaru, zmień rozmiar tylko na podstawie wyświetlanych wierszy. Używaj tylko wyświetlanych wierszy w trybie wirtualnym.
W przypadku wierszy i kolumn użyj
DisplayedCellspola lubDisplayedCellsExceptHeaderswyliczenia DataGridViewAutoSizeRowsMode, DataGridViewAutoSizeColumnsModei DataGridViewAutoSizeColumnMode .W przypadku nagłówków wierszy użyj AutoSizeToDisplayedHeaders pola lub AutoSizeToFirstHeader wyliczenia DataGridViewRowHeadersWidthSizeMode .
Aby uzyskać maksymalną skalowalność, wyłącz automatyczne zmienianie rozmiaru i użyj programowej zmiany rozmiaru.
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:
Aby ustalić, czy wszystkie DataGridViewSelectedCells komórki w kolekcji zostały wybrane przed uzyskaniem dostępu do zawartości kolekcji, sprawdź wartość zwracaną metody AreAllCellsSelected . Należy jednak pamiętać, że ta metoda może spowodować, że wiersze staną się nieudostępniane. Aby uzyskać więcej informacji, zobacz następną sekcję.
Unikaj używania Count właściwości obiektu do System.Windows.Forms.DataGridViewSelectedCellCollection określania liczby zaznaczonych komórek. Zamiast tego należy użyć DataGridView.GetCellCount metody i przekazać DataGridViewElementStates.Selected wartość . Podobnie użyj metod DataGridViewRowCollection.GetRowCount i DataGridViewColumnCollection.GetColumnCount , aby określić liczbę wybranych elementów, zamiast uzyskiwania dostępu do wybranych kolekcji wierszy i kolumn.
Unikaj trybów wyboru opartych na komórkach. Zamiast tego ustaw właściwość DataGridView.SelectionMode na lub DataGridViewSelectionMode.FullRowSelectDataGridViewSelectionMode.FullColumnSelect.
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:
Wiersz zawiera jedną wybraną komórkę, która nie znajduje się w wybranej kolumnie.
Wiersz zawiera komórkę z ustawionymi właściwościami ToolTipText lub ContextMenuStrip .
Wiersz zawiera obiekt z DataGridViewComboBoxCell zestawem Items właściwości .
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:
Unikaj wywoływania
Add(Object[])przeciążenia Add metody iInsert(Object[])przeciążenia Insert metody kolekcji DataGridView.Rows . Te przeciążenia automatycznie tworzą wiersze nieudostępniane.Upewnij się, że wiersz określony we właściwości DataGridView.RowTemplate można udostępnić w następujących przypadkach:
Podczas wywoływania
Add()przeciążeńAdd(Int32)Add metody lub InsertInsert(Int32,Int32)przeciążenia metody kolekcjiDataGridView.Rows.Podczas zwiększania wartości DataGridView.RowCount właściwości.
Podczas ustawiania DataGridView.DataSource właściwości.
Upewnij się, że wiersz wskazany przez
indexSourceparametr może być współużytowany AddCopypodczas wywoływania metod , AddCopiesInsertCopy, i InsertCopies kolekcjiDataGridView.Rows.Upewnij się, że określony wiersz
Add(DataGridViewRow)Add lub wiersze mogą być współdzielone podczas wywoływania przeciążenia metody , AddRange metody,Insert(Int32,DataGridViewRow)przeciążenia InsertInsertRange metody i metody kolekcji DataGridView.Rows .
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ą
foreachpę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ść ,
falsegdy 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ż
- DataGridView
- Dostrajanie wydajności w formancie DataGridView formularzy systemu Windows
- Tryb wirtualny w formancie DataGridView formularzy systemu Windows
- Tryby wyświetlania danych w formancie DataGridView formularzy systemu Windows
- Style komórki w formancie DataGridView formularzy systemu Windows
- Instrukcje: ustawianie domyślnych stylów komórki dla kontrolki DataGridView formularzy systemu Windows
- Opcje ustalania rozmiaru w formancie DataGridView formularzy systemu Windows