Triky s TreeView v .NET Compact Framework

článek je psaný a validní pro .NET Compact Framework (CF) v 2.0 a jazyk vb.net

Sepsal jsem tipy pro celořádkový výběr, přidání události click, doubleclick a v neposlední řadě velmi užitečné barvení řádků/pozadí.

Trik pro černé pozadí a bílý text

Tento problém má jednoduchý základ. Pokud vytvoříte objekt TreeView v CF není podporována vlastnost .BackColor. Samotné VS studio vás na to upozorní. Tím pádem není možné měnit barvu pozadí. První možností je[MORE] napsat vlastní TreeView odvozený z Object. Druhé řešení jsem zvolil já.

Každý přidávaný TreeNode má povoleny vlastnosti pozadí a barvy fontu. Proto je potřeba vytvořit a nastavit asi takhle:
Dim node As New TreeNode
node.Text = "aa"
node.ForeColor = Color.WhiteSmoke
node.BackColor = Color.Black
TreeView.Nodes.Add(node)

Tím máme černé pozadí.

Problémy

Černá barva je jen pod textem samotným. V CF není vlastnost pro nastavení FullRow. To lze obejít přidávání hodně (hodně hodně) mezer za zobrazený text. Něco jako +” “. Prasečina, ale funguje. Potřebujeme výsledky. Výkonostně to není problém. Vzniká tím druhotný problém s horizontálním posuvníkem. Ten nelze vypnout a tak je možnost ho buď skrýt jinou komponentou (mimo form) nebo napsat inteligentní algoritmus, který řádek doplní jen určitým potřebným množstvím mezer. Já volím první.

A poslední problém, který je potřeba vyřešit pro černé pozadí? I když bude TreeView prázdný musí být vyplněn položkami a to přesně počtem, které se vejdou na jeho výšku. Výška musí být násobek výšky řádku. Prázdné položky budou dělat černo a když začnou přibývat data, lze prázdné odebírat. Samotný algoritmus ať si každý udělá jak potřebuje.

Trik pro přidání OnClick a DoubleClickeventu(události)

TreeView nemá událost OnClick a občas by se mohla hodit :). Zase máme víc možností.

Buď se použije nízkoúrovňové GetFocus (viz msdn) nebo se použije nějaká existující událost a obalí se logikou. Na to je vhodná událost AfterSelect. Za běhu přidáme pomocí AddHandler TreeView.AfterSelect, AddressOf MojeFunkceClick. Samotná MojeFunkceClick vypadá asi takhle Sub MojeFunkceClick(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs). Když tedy někdo označí položku v PDA spadne to do týhle funkce. Zde máme k dispozici e proměnou, v které je například e.Node.Tag nebo e.Node.Text. Můžeme napsat logiku na ignorování našich černých prázdných řádků. Taky sem můžeme vyrobit funkce na mazání řádku atd. Ovšem aby mohl AfterSelect opět fungovat musíme TreeView.SeletedNode = nothing. Tím jsme vyrobili onclick. DoubleClick bude vyžadovat nějakou proměnou a timeout abychom mohli realizovat ten dvojklik. Nechám to na každém.

FullRow a barevně označený řádek

S předchozí funkcí TreeView.SelectedNode= nothing přijdete o označený řádek. Proto je vhodné, uchovat si který že to byl řádek kliknut a při vykreslování položek do TreeView změnit barvu pozadí/textu a tak dále. Dá se s tím docela kouzlit. Dělat multiselect a podobně. A ten FullRow. V dokumentaci je samotná funkce jen pro velký framework a ještě s jistými omezeními. Jak jsem psal výše, stačí k textu přilepit hodně mezer a je vystaráno.