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:

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:

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:

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í:

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é:

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 na truehodnotu . 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é