Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Lekce 16 - Ovládací prvky Windows Forms počtvrté

C# .NET Formuláře Windows Forms Ovládací prvky Windows Forms počtvrté

ONEbit hosting Unicorn College 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í ovládací prvky RichTextBox, MaskedTextBox, TabControl, LinkLabel, Timer a ProgressBar.

MaskedTextBox

MaskedTextBox ve Windows Forms

Jde o speciální druh TextBoxu, kde si můžeme jednoduše stanovit, v jakém formátu do něj uživatel bude zadávat data. To se hodí např. pro získávání času, data, telefonního čísla a dalších podobných údajů. Do pole poté nelze 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 níže napíšete váš vysněný formát, např.: 00.00.0000 by bylo pro zadání konkrétního datumu.

Kromě nuly můžeme použít znak L pro písmena. Pokud chceme povolit vynechané místo, používá se ?. A slouží pro zadávání písmen nebo čísel. 0 je tedy pouze pro čísla a 9 dovoluje čísla + volné místo.

RichTextBox

RichTextBox ve Windows Forms

RichTextBox je 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 pouze zvolené části textu. Jde to samozřejmě i pro celý text pomocí vlastností ForeColor (barva textu) a BackColor (barva pozadí). Toto ale umí také obyčejný TextBox.

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

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

Tento kód tedy vybere text "text" a s tím poté můžeme pracovat. Použít bychom mohli samozřejmě i LastIndexOf(). K vybrané části textu se poté 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, která určuje maximální počet znaků, které je RichTextBox schopen pojmout. RightMargin určuje pravé odsazení. Užitečný je také ZoomFactor pro zvětšování obsahu.

Událostí je zde mnoho. TextChanged se bude hodit a jak název napovídá, volá se, když se text změnil. LinkClicked se vyvolá v případě, že bylo kliknuto na URL odkaz v textu.

LinkLabel

LinkLabel ve Windows Forms

Jak se dá vyvodit z názvu (podobně jako u ostatních komponent) jde jednoduše o Label, který funguje jako odkaz na webovou adresu. Vlastnosti jsou též podobné obyčejnému Labelu. Jeho použití nicméně není úplně intuitivní. Pomocí vlastnosti LinkArea můžeme 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);

Kód výše přidáme do konstruktoru okna nebo do události Load formuláře. Hlavní událostí LinkLabel je LinkClicked. Do ní 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 System.Diagnostics.

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 je 1 minuta. Důlež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() poté Timer logicky zastaví.

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á jedinou událost a tou je Tick, neboli každé uplynutí nastaveného intervalu.

TabControl

TabControl ve Windows Forms

Jedná se o ovládací prvek se záložkami, který do úvodu nejlépe vysvětlí obrázek. Obsahuje několik záložek, do kterých lze umístit další prvky (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ůžeme i pojmenovat. Fungují jako kontejner, můžeme 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í záložek sice nelze deaktivovat, ale můžete je schovat mimo okno. To osvětlí screenshot.

TabControl ve Windows Forms

Na další záložku se poté přepíná v kódu např. pomocí jejího názvu takto:

tabControl1.SelectTab("[název záložky]");

Či pomocí jejího indexu:

tabControl1.SelectedIndex = [index];

ProgressBar

Progressbar ve Windows Forms

Hodí se např. pro informování uživatele o tom, jak pokračuje určitý proces v aplikaci. 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 vykreslen a konečně Step určuje, o kolik se zaplní, pokud zavoláte metodu PerformStep(). Na výběr jsou tři možnosti - 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 pod vlastností MarqueeAnimationSpeed.

Marquee ProgressBar nelze jednoduše zapnout a je třeba použít menší "trik". Pokud chcete, aby se pohyboval až po aktivování, musíte jej předtím nastavit např. na Continuous a poté někde v kódu zavolat:

progressBar1.Style = ProgressBarStyle.Marquee;

Analogickým způsobem jej i zastavíte.

progressBar1.Style = ProgressBarStyle.Continuous;

Reset ProgressBaru provedenme nastavením jeho hodnoty (Value) na 0. Můžeme ho také schovat pomocí metody Hide() a poté pomocí Show() opět zobrazit. V příští lekci, Vlastní ovládací prvky v C# .NET, si ukážeme jak si vytvořit svůj vlastní ovládací prvek.


 

 

Č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 (4)

 

 

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
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
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
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
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.8.2017 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.8.2017 22:23
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Daniel Šup
David Čápka:16.8.2017 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.8.2017 22:59
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Daniel Šup
Člen
Avatar
Odpovídá na David Čápka
Daniel Šup:17.8.2017 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.8.2017 12:54
Avatar
David Oczka
Redaktor
Avatar
Odpovídá na Daniel Šup
David Oczka:17.8.2017 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.8.2017 13:29
Avatar
Daniel Šup
Člen
Avatar
Odpovídá na David Oczka
Daniel Šup:17.8.2017 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.8.2017 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