Doporučené postupy pro změnu velikosti v ovládacím prvku Windows Forms DataGridView
Tento DataGridView ovládací prvek je navržený tak, aby poskytoval maximální škálovatelnost. Pokud potřebujete zobrazit velké objemy dat, měli byste postupovat podle pokynů popsaných v tomto tématu, abyste se vyhnuli využívání velkého množství paměti nebo snížení rychlosti odezvy uživatelského rozhraní. Toto téma popisuje následující problémy:
Efektivní používání stylů buněk
Efektivní používání místních nabídek
Efektivní použití automatické změny velikosti
Efektivní používání vybraných buněk, řádků a sloupců
Použití sdílených řádků
Zabránění zrušení sdílení řádků
Pokud máte zvláštní požadavky na výkon, můžete implementovat virtuální režim a poskytovat vlastní operace správy dat. Další informace naleznete v tématu Režimy zobrazení dat v ovládacím prvku model Windows Forms DataGridView.
Efektivní používání stylů buněk
Každá buňka, řádek a sloupec můžou mít vlastní informace o stylu. Informace o stylu jsou uloženy v DataGridViewCellStyle objektech. Vytváření objektů stylu buněk pro mnoho jednotlivých DataGridView prvků může být neefektivní, zejména při práci s velkými objemy dat. Pokud se chcete vyhnout dopadu na výkon, použijte následující pokyny:
Vyhněte se nastavení vlastností stylu buňky pro jednotlivé DataGridViewCell objekty nebo DataGridViewRow objekty. To zahrnuje objekt řádku určený vlastností RowTemplate . Každý nový řádek, který je naklonován ze šablony řádku, obdrží vlastní kopii objektu stylu buňky šablony. Pro zajištění maximální škálovatelnosti nastavte vlastnosti stylu buňky na DataGridView úrovni. Například nastavte DataGridView.DefaultCellStyle vlastnost místo DataGridViewCell.Style vlastnosti.
Pokud některé buňky vyžadují jiné formátování než výchozí formátování, použijte stejnou DataGridViewCellStyle instanci napříč skupinami buněk, řádků nebo sloupců. Vyhněte se přímému nastavení vlastností typu DataGridViewCellStyle u jednotlivých buněk, řádků a sloupců. Příklad sdílení stylu buněk najdete v tématu Postupy: Nastavení výchozích stylů buněk pro ovládací prvek model Windows Forms DataGridView. Můžete se také vyhnout snížení výkonu při individuálním nastavení stylů buněk zpracováním obslužné rutiny CellFormatting události. Příklad: Přizpůsobení formátování dat v ovládacím prvku model Windows Forms DataGridView.
Při určování stylu buňky místo vlastnosti použijte DataGridViewCell.InheritedStyle vlastnost DataGridViewCell.Style . Style Přístup k vlastnosti vytvoří novou instanci DataGridViewCellStyle třídy, pokud vlastnost ještě nebyla použita. Tento objekt navíc nemusí obsahovat úplné informace o stylu buňky, pokud jsou některé styly zděděné z řádku, sloupce nebo ovládacího prvku. Další informace o dědičnosti stylu buňky naleznete v části Styly buněk v ovládacím prvku model Windows Forms DataGridView.
Efektivní používání místních nabídek
Každá buňka, řádek a sloupec můžou mít vlastní místní nabídku. Místní nabídky v ovládacím DataGridView prvku jsou reprezentovány ovládacími ContextMenuStrip prvky. Stejně jako u objektů stylu buněk ovlivní vytváření místních nabídek pro mnoho jednotlivých DataGridView prvků negativní vliv na výkon. Abyste se vyhnuli tomuto trestu, použijte následující pokyny:
Vyhněte se vytváření místních nabídek pro jednotlivé buňky a řádky. To zahrnuje šablonu řádku, která se naklonuje spolu s místní nabídkou při přidání nových řádků do ovládacího prvku. Pro maximální škálovatelnost použijte pouze vlastnost ovládacího prvku ContextMenuStrip k určení jedné místní nabídky pro celý ovládací prvek.
Pokud potřebujete více místních nabídek pro více řádků nebo buněk, zpracujte je CellContextMenuStripNeeded nebo RowContextMenuStripNeeded proveďte zpracování událostí. Tyto události umožňují spravovat objekty místní nabídky sami, což vám umožní ladit výkon.
Efektivní použití automatické změny velikosti
Řádky, sloupce a záhlaví se dají automaticky změnit jako změny obsahu buňky tak, aby se celý obsah buněk zobrazoval bez výřezu. Změna režimů velikosti může také změnit velikost řádků, sloupců a záhlaví. Chcete-li určit správnou velikost, DataGridView musí ovládací prvek zkontrolovat hodnotu každé buňky, kterou musí obsahovat. Při práci s velkými datovými sadami může tato analýza negativně ovlivnit výkon ovládacího prvku při automatické změně velikosti. Pokud se chcete vyhnout sankcím za výkon, použijte následující pokyny:
Nepoužívejte u ovládacího prvku automatickou změnu velikosti DataGridView s velkou sadou řádků. Pokud použijete automatické nastavení velikosti, změní se velikost jenom na základě zobrazených řádků. Používejte také jenom zobrazené řádky ve virtuálním režimu.
Pro řádky a sloupce použijte
DisplayedCells
poleDisplayedCellsExceptHeaders
DataGridViewAutoSizeRowsMode, DataGridViewAutoSizeColumnsModea DataGridViewAutoSizeColumnMode výčty.Pro záhlaví řádků použijte AutoSizeToDisplayedHeaders nebo AutoSizeToFirstHeader pole výčtu DataGridViewRowHeadersWidthSizeMode .
Pokud chcete maximální škálovatelnost, vypněte automatickou změnu velikosti a použijte programovou změnu velikosti.
Další informace naleznete v tématu Možnosti velikosti v ovládacím prvku model Windows Forms DataGridView.
Efektivní používání kolekcí vybraných buněk, řádků a sloupců
Kolekce SelectedCells neprovádí efektivně s velkými výběry. Kolekce SelectedRows a SelectedColumns kolekce mohou být také neefektivní, i když do menší míry, protože existuje mnoho řádků než buňky v typickém DataGridView ovládacím prvku a mnoho méně sloupců než řádků. Pokud se chcete vyhnout sankcím za výkon při práci s těmito kolekcemi, použijte následující pokyny:
Chcete-li zjistit, zda byly vybrány všechny buňky v kolekci DataGridView před přístupem k obsahu SelectedCells kolekce, zkontrolujte návratové AreAllCellsSelected hodnoty metody. Všimněte si však, že tato metoda může způsobit, že řádky budou nesdílené. Další informace naleznete v následující části.
Vyhněte se použití Count vlastnosti System.Windows.Forms.DataGridViewSelectedCellCollection k určení počtu vybraných buněk. Místo toho použijte metodu DataGridView.GetCellCount a předejte DataGridViewElementStates.Selected hodnotu. Podobně použijte DataGridViewRowCollection.GetRowCount a DataGridViewColumnCollection.GetColumnCount metody k určení počtu vybraných prvků místo přístupu k vybraným kolekcím řádků a sloupců.
Vyhněte se režimům výběru na základě buněk. Místo toho nastavte DataGridView.SelectionMode vlastnost na DataGridViewSelectionMode.FullRowSelect hodnotu nebo DataGridViewSelectionMode.FullColumnSelect.
Použití sdílených řádků
Efektivní využití paměti se dosahuje v ovládacím DataGridView prvku prostřednictvím sdílených řádků. Řádky budou sdílet co nejvíce informací o jejich vzhledu a chování sdílením instancí DataGridViewRow třídy.
Sdílení instancí řádků šetří paměť, řádky se můžou snadno zrušit. Například pokaždé, když uživatel pracuje přímo s buňkou, stane se jeho řádek nesdíleným. Vzhledem k tomu, že se tomu nelze vyhnout, jsou pokyny v tomto tématu užitečné pouze při práci s velmi velkým množstvím dat a pouze tehdy, když uživatelé budou pracovat s relativně malou částí dat při každém spuštění programu.
Řádek nelze sdílet v nevázaném DataGridView ovládacím prvku, pokud některá z jejích buněk obsahuje hodnoty. DataGridView Pokud je ovládací prvek vázán na externí zdroj dat nebo když implementujete virtuální režim a poskytujete vlastní zdroj dat, hodnoty buněk se ukládají mimo ovládací prvek, nikoli v objektech buněk, což umožňuje sdílení řádků.
Objekt řádku lze sdílet pouze v případě, že stav všech jeho buněk lze určit ze stavu řádku a stavů sloupců obsahujících buňky. Pokud změníte stav buňky tak, aby se už nedá odvodit ze stavu jeho řádku a sloupce, nelze řádek sdílet.
Řádek například nelze sdílet v žádné z následujících situací:
Řádek obsahuje jednu vybranou buňku, která není ve vybraném sloupci.
Řádek obsahuje buňku s nastavenými vlastnostmiToolTipText.ContextMenuStrip
Řádek obsahuje s DataGridViewComboBoxCell jeho Items sadou vlastností.
V vázaném režimu nebo virtuálním režimu můžete poskytnout nástroj Tipy a místní nabídky pro jednotlivé buňky zpracováním CellToolTipTextNeeded událostí a CellContextMenuStripNeeded událostí.
Ovládací DataGridView prvek se automaticky pokusí použít sdílené řádky při každém přidání řádků do DataGridViewRowCollection. Pomocí následujících pokynů se ujistěte, že jsou řádky sdílené:
Vyhněte se volání
Add(Object[])
přetížení Add metody aInsert(Object[])
přetížení Insert metody DataGridView.Rows kolekce. Tato přetížení automaticky vytvářejí nesdílené řádky.Ujistěte se, že řádek zadaný ve DataGridView.RowTemplate vlastnosti lze sdílet v následujících případech:
Při volání
Add()
neboAdd(Int32)
přetížení Add metody neboInsert(Int32,Int32)
přetížení Insert metody DataGridView.Rows kolekce.Při zvýšení hodnoty DataGridView.RowCount vlastnosti.
Při nastavování DataGridView.DataSource vlastnosti.
Ujistěte se, že řádek označený parametrem
indexSource
lze sdílet při volání AddCopy, AddCopies, InsertCopya InsertCopies metody DataGridView.Rows kolekce.Ujistěte se, že zadaný řádek nebo řádky lze sdílet při volání
Add(DataGridViewRow)
přetížení Add metody, AddRange metody,Insert(Int32,DataGridViewRow)
přetížení Insert metody a InsertRange metody DataGridView.Rows kolekce.
Chcete-li zjistit, zda je řádek sdílený, použijte metodu DataGridViewRowCollection.SharedRow k načtení objektu řádku a pak zkontrolujte vlastnost objektu Index . Sdílené řádky mají Index vždy hodnotu vlastnosti –1.
Zabránění zrušení sdílení řádků
Sdílené řádky se můžou stát nesdílenými v důsledku akce kódu nebo uživatele. Abyste se vyhnuli dopadu na výkon, měli byste se vyhnout tomu, aby se řádky nesdílely. Během vývoje aplikací můžete událost zpracovat RowUnshared a určit, kdy se řádky stanou nesdílenými. To je užitečné při ladění problémů se sdílením řádků.
Pokud chcete zabránit zrušení sdílení řádků, použijte následující pokyny:
Vyhněte se indexování Rows kolekce nebo iteraci pomocí smyčky
foreach
. Obvykle nebudete potřebovat přímý přístup k řádkům. DataGridView metody, které pracují s řádky, přebírají argumenty indexu řádků místo instancí řádků. Kromě toho obslužné rutiny pro události související s řádky přijímají objekty argumentů události s vlastnostmi řádku, které můžete použít k manipulaci s řádky, aniž by je způsobily jejich zrušení sdílení.Pokud potřebujete získat přístup k objektu řádku, použijte metodu DataGridViewRowCollection.SharedRow a předejte skutečný index řádku. Všimněte si však, že úprava sdíleného objektu řádku načteného touto metodou upraví všechny řádky, které sdílejí tento objekt. Řádek pro nové záznamy se ale nesdílí s dalšími řádky, takže nebude ovlivněn při úpravě jiného řádku. Všimněte si také, že různé řádky reprezentované sdíleným řádkem můžou mít různé místní nabídky. Chcete-li načíst správnou místní nabídku z instance sdíleného řádku, použijte metodu GetContextMenuStrip a předejte skutečný index řádku. Pokud místo toho přistupujete k vlastnosti sdíleného řádku, použije index sdíleného řádku ContextMenuStrip -1 a nenačte správnou místní nabídku.
Vyhněte se indexování DataGridViewRow.Cells kolekce. Přímý přístup k buňce způsobí, že se jeho nadřazený řádek přestane sdílet a vytvoří instanci nové DataGridViewRow. Obslužné rutiny pro události související s buňkami přijímají objekty argumentů události s vlastnostmi buňky, které můžete použít k manipulaci s buňkami, aniž by byly řádky nesdílené. Pomocí vlastnosti můžete také CurrentCellAddress načíst indexy řádků a sloupců aktuální buňky bez přímého přístupu k buňce.
Vyhněte se režimům výběru na základě buněk. Tyto režimy způsobují, že se řádky přestanou sdílet. Místo toho nastavte DataGridView.SelectionMode vlastnost na DataGridViewSelectionMode.FullRowSelect hodnotu nebo DataGridViewSelectionMode.FullColumnSelect.
Nezpracovávejte události DataGridViewRowCollection.CollectionChanged ani DataGridView.RowStateChanged události. Tyto události způsobují, že se řádky přestanou sdílet. Také nevolejte DataGridViewRowCollection.OnCollectionChanged metody ani DataGridView.OnRowStateChanged metody, které tyto události vyvolávají.
Nepřistupujte ke kolekci DataGridView.SelectedCells , pokud DataGridView.SelectionMode je FullColumnSelecthodnota vlastnosti , ColumnHeaderSelect, FullRowSelectnebo RowHeaderSelect. To způsobí, že se všechny vybrané řádky přestanou sdílet.
Nevolejte metodu DataGridView.AreAllCellsSelected . Tato metoda může způsobit, že se řádky přestanou sdílet.
Nevolejte metodu DataGridView.SelectAll , pokud DataGridView.SelectionMode je CellSelecthodnota vlastnosti . To způsobí, že se všechny řádky přestanou sdílet.
Nenastavujte ReadOnly nebo Selected vlastnost buňky, pokud
false
je odpovídající vlastnost ve sloupci nastavena natrue
hodnotu . To způsobí, že se všechny řádky přestanou sdílet.Nepřistupujte k DataGridViewRowCollection.List vlastnosti. To způsobí, že se všechny řádky přestanou sdílet.
Nevolejte
Sort(IComparer)
přetížení Sort metody. Řazení pomocí vlastního porovnávače způsobí, že se všechny řádky přestanou sdílet.
Viz také
- DataGridView
- Ladění výkonu v ovládacím prvku Windows Forms DataGridView
- Virtuální režim v ovládacím prvku Windows Forms DataGridView
- Režimy zobrazení dat v ovládacím prvku Windows Forms DataGridView
- Styly buňky v ovládacím prvku Windows Forms DataGridView
- Postupy: Nastavení výchozích stylů buňky pro ovládací prvek Windows Forms DataGridView
- Možnosti změny velikosti v ovládacím prvku Windows Forms DataGridView
.NET Desktop feedback
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro