úterý 22. ledna 2008

C# a .NET: DataGridView a ScrollBary

DataGridView je nová komponenta v .NET frameworku od verze 2.0 výše. Její komplexnost není třeba představovat. Kromě toho, že dědí události Controlu, definuje také svých vlastních 162 událostí. Pokud nepotřebujete žádné vlastní speciality, bohatě si vystačíte s tím, co je již naprogramováno, jen skládáte metody, používáte vlastnosti apod.


Co když ale potřebujete přistoupit k posuvníkům (ScrollBars)? Třeba proto, že je chcete programově z kódu posunout. Zní to jako naprosto triviální úkol, ale zabralo mi celé dopoledne, než jsem dohledal alespoň malé vodítko. Hledal jsem na všech možných i nemožných místech, prolistoval tři nebo čtyři knihy (C# 2005 Velká kniha řešení, "C# a Windows Forms", "C# Formuláře Windows" a také "C# Programujeme profesionálně") a otravoval pár kontaktů v messengeru. Nic. Po hodinách hledání, kdy jsem byl už zoufalý, mne alespoň pobavila hláška v nějaké diskusi, která se sice týkala jiné komponenty, ale naprosto vystihuje můj případ: "Is this component retarded, or it is me?"

Nicméně, zde je kousek kódu, jak se dostat k posuvníkům (HScrollBar a VScrollBar) náležícím k DataGridView:
DataGridView dgvMujGrid = new DataGridView();
foreach (Control prvekDataGridu in dgvMujGrid.Controls)
{
if (prvekDataGridu is HScrollBar)
{
((HScrollBar)prvekDataGridu).Value +=((HScrollBar)prvekDataGridu).SmallChange;
}
else if (prvekDataGridu is VScrollBar)
{
((VScrollBar)prvekDataGridu).Value +=((VScrollBar)prvekDataGridu).SmallChange;
}
}

V tuto chvíli to je možná trošku nelogický kód, ale šlo jen o ukázku. Co jsme tedy udělali. Cyklem projdeme všechny prvky (Controls) DataGridView a otestujeme, jestli to náhodou nejsou instance třídy HScrollBar nebo VScrollBar. Pokud ano, přetypujeme je na tento typ (H/VScrollBar) a hodnotu posuvníku zvýšíme o nastavenou hodnotu malého skoku (SmallChange).

V mém případě se však fanfáry nekonaly, protože jsem potřeboval simulovat kliknutí na posuvník myši - které způsobí posunutí obsahu požadovaným směrem. Jediné čeho jsem však s pomocí tohoto kódu docílil bylo, že jsem posunul posuvník, bez dalšího efektu na obsah. Ten zůstal nezměněn. Protože jsem pak problém vyřešil jinak a posuvníky jsem nepotřeboval, neřešil jsem, jak šoupat s obsahem. Možná příště.

P.S.: DataGridView má chráněné vlastnosti (HorizontalScrollBar a VerticalScrollBar), díky kterým může k posuvníkům přistupovat přímo. Protože jsou však chráněné, museli byste DataGridView podědit, abyste k nim mohli přistoupit.

Zde odkaz na DataGridView members do msdn: http://msdn2.microsoft.com/en-us/library/system.windows.forms.datagridview.aspx

Žádné komentáře:

Okomentovat