Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

16. díl - Kontrolky Windows Forms počtvrté

C# .NET Formuláře Windows Forms Kontrolky Windows Forms počtvrté

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Windows Forms - Dialogy, jsme se věnovali aplikačnímu menu a dialogům. Dnes se podíváme jak se používají kontrolky RichTextBox, MaskedTextBox, TabControl, LinkLabel, Timer a ProgressBar.

MaskedTextBox

MaskedTextBox ve Windows Forms

Jde o speciální druh TextBoxu, kde si můžete jednoduše stanovit, v jakém formátu do něho uživatel bude zadávat data. To se hodí třeba pro získávání času, data, telefonního čísla a dalších podobných údajů. Do pole poté nejde zadat nic jiného, než povolený formát, což nahrazuje nutnost vstupy validovat.

Klíčovou vlastností je zde Mask, která vlastně určuje formát zadávaného čísla. Pokud si nevyberete z předdefinovaných, je snadné si vytvořit vlastní. Vyberete <Custom> a do Mask boxu dole napíšete váš vysněný formát, takže třeba: 00.00.0000 - takto načtete kompletní datum.

"L" slouží pro načtení písmen, pokud chcete povolit vynechané místo, tak se používá "?". "A" slouží pro načitání písmen nebo čísel. "0" je pouze pro čísla a "9" dovoluje čísla + volné místo.

RichTextBox

RichTextBox ve Windows Forms

Jedná se vlastně o takový TextBox na steroidech. Umožňuje pokročilé formátování textu a další vychytávky. Hlavní je asi to, že můžete měnit font či barvu písma pouze u zvoleného textu. Jde to samozřejmě i pro celý pomocí vlastností ForeColor (barva textu) a BackColor (barva pozadí). Tohle ale umí také obyčejný TextBox.

Výběr konkrétního textu se dělá metodou Select(). Ta bere jako parametry indexy úseku, který chcete formátovat. Tedy začáteční a konečný. To lze udělat jednoduše čísly, nebo si pomoci vlastností. To názorně ukazuje příklad.

richTextBox1.Select(richTextBox1.Text.IndexOf("text"), "text".Length);
//nebo
richTextBox1.Select(0, 10);

Tento kód tedy vybere „text“ a s ním pak můžete pracovat. Použít můžete samozřejmě také LastIndexOf(). K vybrané části textu se pak přistupuje pomocí Selection[Font, BackColor, atd]. Takže úprava by vypadala nějak takto:¨

richTextBox1.SelectionFont = new Font("Microsoft sans", 20);
richTextBox1.SelectionBackColor = Color.Black;
richTextBox1.SelectionColor = Color.Blue;

Z vlastností stojí za zmínku MaxLength, což určuje maximální počet znaků, které je RichTextBox schopen pojmout. RightMargin pak určuje pravé odsazení. Užitečný je také ZoomFactor pro zvětšování obsahu.

Událostí je zde velmi mnoho. TextChange se bude hodit a jak název napovídá, volá se, pokud je měněn text. LinkClicked je aktivní v případě, že bylo kliknuto na URL odkaz.

LinkLabel

LinkLabel ve Windows Forms

Jak se dá vyčíst z názvu (podobně jako u ostatních komponent) jde prostě o Label, který funguje jako HTML odkaz. Vlastnosti jsou tak podobné obyčejnému Labelu. Jeho použití ale není úplně intuitivní. Pomocí vlastnosti LinkArea můžete ještě vybrat, na jakou část LinkLabelu půjde kliknout. Start určuje začáteční index a Length počet znaků. Základní použití by mohlo vypadat takto:

LinkLabel.Link link = new LinkLabel.Link();
link.LinkData = "http://www.itnetwork.cz";
linkLabel1.Links.Add(link);

Tento kód přidáte do konstruktoru okna nebo do eventu Load. Hlavním eventem LinkLabel je LinkClicked. Sem je potřeba napsat následující kód:

Process.Start(e.Link.LinkData as String);

Ten pošle příkaz systému a nastavená URL adresa se otevře v defaultním prohlížeči. Pro použití je třeba přidat using Systém.Diagnos­tics.

Timer

Jedná se o velmi šikovnou komponentu, která umožňuje provést určité akce automaticky v daném časovém intervalu. Klíčovou vlastností je zde Interval, zadává se v milisekundách a udává rozestupy mezi akcemi. (60 000 ms = 1 minuta) Duležitá je také vlastnost Enabled, jež určuje, jestli je Timer aktivní po spuštění programu. Druhou možností je spustit ho metodou Start(). Metoda Stop() pak Timer logicky deaktivuje.

Timer nemá vlastní vlákno, pamatujte tedy na to, že při vykonávání náročnějšího úkonu "zasekne" celý formulář.

Timer má jediný event a tím je Tick, neboli každé uplynutí nastaveného intervalu.

TabControl

TabControl ve Windows Forms

Jedná se o komponentu, kterou do úvodu nejlépe vysvětlí obrázek. Obsahuje několik záložek, do kterých lze umístit další kontrolky (jako např. panel) a mezi záložkami lze poté přepínat. Jednotlivé "záložky" se přidávají ve vlastnostech TabControl pod položkou TabPages, kde je můžete i pojmenovat. Jejich plocha tak funguje jako klasické okno – můžete do nich přidávat další komponenty. Další vlastnosti slouží výhradně na změnu vzhledu.

TabControl můžete také použít třeba jako průvodce instalací. Tlačítka na přepínání tabů sice nelze deaktivovat, ale můžete je schovat mimo okno. To osvětlí screenshot.

TabControl ve Windows Forms

Na další tab se pak přepíná v kódu třeba pomocí jeho názvu takto:

tabControl1.SelectTab("[název tabu]");

Či pomocí jeho indexu:

tabControl1.SelectedIndex = [číslo indexu];

ProgressBar

Progressbar ve Windows Forms

Hodí se třeba pro informování uživatele o tom, jak pokračuje určitý proces v programu. Vlastnost Maximum určuje, kolik „políček“ daný progressbar má. Důležitá je také vlastnost Style, která určuje, v jakém stylu bude progress bar proveden a konečně Step určuje, o kolik se zaplní, pokud zavoláte metodu PerformStep(). Na výběr jsou tři – Blocks (nabývá skokově), Continuous (nabývá plynule) a Marquee. Poslední jmenovaný se liší. Pokud je nastaven, progressbar nenabývá, ale plynule "jezdí" bez zastavení. Dá se nastavit také rychlost, najdete ji po vlastností MarqueeAnimati­onSpeed.

Marquee progressbar nejde jednoduše zapnout a je třeba použít menší "trik". Pokud chcete, aby se pohyboval až po aktivování, musíte ho předtím nastavit třeba na Continuous a pak někde v kódu přidat:

progressBar1.Style = ProgressBarStyle.Marquee;

Analogickým způsobem ho zase zastavíte.

progressBar1.Style = ProgressBarStyle.Continuous;

Reset progressbaru provede nastavením jeho hodnoty (Value) na 0. Můžete ho také schovat pomocí Hide() a pak pomocí Show() zobrazit. V příští lekci, Vlastní ovládací prvky v C# .NET, si ukážeme jak si vytvořit svou vlastní kontrolku.


 

 

Článek pro vás napsal Paradise
Avatar
Jak se ti líbí článek?
7 hlasů
Miniatura
Předchozí článek
Windows Forms - Dialogy
Miniatura
Následující článek
Vlastní ovládací prvky v C# .NET
Aktivity (3)

 

 

Komentáře
Zobrazit starší komentáře (4)

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:2.6.2013 13:07

Špatně jsi pochopil i dvojku a zdrojový kód je v článku. Nevidím důvod sem házet odkazy na MSDN, stejně jako do fóra házíš odkazy na Google. Aby se z tebe nestal druhý Matesax. V MSDN bude vždy něco navíc, úkolem devbooku není MSDN suplovat, ale poskytnout česky to nejdůležitější.

Odpovědět  +1 2.6.2013 13:07
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Odpovídá na David Čápka
Michal Žůrek (misaz):2.6.2013 13:13

kdyby popsal jak krom čísel obsloužit i písmena ani neceknu.

Uznávám chybu (chyby).

Odpovědět 2.6.2013 13:13
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Žůrek (misaz)
David Čápka:2.6.2013 13:15

S tím máš pravdu, to by se tam hodilo.

Odpovědět 2.6.2013 13:15
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Paradise
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Paradise:2.6.2013 16:00

Dík za názor. Článek jsem před vydáním konzultoval s sdracem. Kam myslíš, že by se hodila i písmena?

 
Odpovědět 2.6.2013 16:00
Avatar
Odpovídá na Paradise
Michal Žůrek (misaz):2.6.2013 16:16

k MaskedTextBox. Máš tam jak do masky dostat čísla a na písmena jsi zapoměl.

Odpovědět 2.6.2013 16:16
Nesnáším {}, proto se jim vyhýbám.
Avatar
Daniel Šup
Člen
Avatar
Daniel Šup:16. srpna 22:23

Zdravím,

v článku je uvedeno, že tlačítka na přepínání tabů lze schovat mimo okno. Zajímalo by mě, jakým způsobem lze tlačítka na přepínání tabů schovat mimo okno. Jak mám skrýt všechny taby kromě jednoho, abych dosáhl podobného výsledku jako na screenshotu?

 
Odpovědět 16. srpna 22:23
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Daniel Šup
David Čápka:16. srpna 22:59

Můžeš skrýt jen všechny a to tak, že celý tabcontrol posuneš o kousek nahoru, potom "zajede" část s taby pod horní lištu okna. Na přepínání tabů si pak můžeš udělat jakákoli tlačítka pomocí standardních buttonů kdekoli a dělat si s nimi co chceš.

Odpovědět 16. srpna 22:59
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Daniel Šup
Člen
Avatar
Odpovídá na David Čápka
Daniel Šup:17. srpna 12:54

Ahoj,

velice ti děkuji za tvou odpověď. Nyní jsem si zkusil posunout celý tabcontrol tak, aby část s taby byla pod horní lištou okna. Pak už jen stačí vložit button a přidat mu akci. Když toto udělám takto, tak to bude fungovat stejně jako na screenshotu.

 
Odpovědět 17. srpna 12:54
Avatar
David Oczka
Redaktor
Avatar
Odpovídá na Daniel Šup
David Oczka:17. srpna 13:29

Je možné skrýt i jednotlivé záložky, ale je třeba to trochu obejít...

Vytvoříš si TabControl se všemi záložkami, které budeš chtít (i jejich případným obsahem). Pak v konstruktoru formuláře nebo Load události uložíš všechny záložky do vlastního seznamu, který je v kódu níže nazván myTabPages.

List<TabPage> myTabPages = new List<TabPage>();

public Form1()
{
    InitializeComponent();

    for (int i = 0; i < tabControl1.TabPages.Count; i++)
    {
        // Uložení záložky (získání reference) z tabControl1 do seznamu myTabPages
        myTabPages.Add(tabControl1.TabPages[i]);
    }
}

A pak podle situace odstraníš záložku, kterou budeš chtít skrýt, ze seznamu TabPages v instanci TabControl (níže nazvaná tabControl1). Reference na ni Ti zůstane zachována v seznamu myTabPages. V ukázce níže mám tlačítko a podle proměnné a si zobrazuji nebo skrývám třetí záložku.

bool a = true;

private void button1_Click(object sender, EventArgs e)
{
    if (a)
    {
        a = false;
        // Odstraníme záložku z komponenty tabControl1
        tabControl1.TabPages.RemoveAt(2);
    }
    else
    {
        a = true;
        // Vložíme záložku ze seznamu do komponenty tabControl1
        tabControl1.TabPages.Insert(2, TabPages[2]);
    }
}
 
Odpovědět 17. srpna 13:29
Avatar
Daniel Šup
Člen
Avatar
Odpovídá na David Oczka
Daniel Šup:17. srpna 18:58

Ahoj,

velice ti děkuji za tvou odpověď. Zkusil jsem zkopírovat tvůj kód a změnit 2 na 1 a druhá záložka se mi skryje.

 
Odpovědět 17. srpna 18:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 14. Zobrazit vše