Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 18 - Vlastní ovládací prvky v C# .NET

V minulé lekci, Tvoříme vlastní Syntax Highlighter pomocí RichTextBox v C#, jsme si vytvořili vlastní syntax highlighter.

Asi však uznáte, že nejsou všemocné a zkrátka a dobře nestačí na všechno. Dnes se v C# tutoriálu podíváme na tvorbu vlastních ovládacích prvků.

Představme si, že potřebujeme udělat progressbar, který se bude načítat odzadu. Výsledek bude vypadat asi nějak takto:

Progressbar načítaný naopak - Windows Forms - Okenní aplikace v C# .NET

ProgresBar bude tedy celkem obyčejný, jen se bude načítat zprava doleva.

Přidání prvku do projektu

V Solution Exploreru klikneme pravým tlačítkem myši na projekt a zvolíme Add New Item. V dialogu Add New Item vybereme šablonu User Control, ovládací prvek pojmenujeme MujProgressBar.cs.

Add New Item – User Control - Windows Forms - Okenní aplikace v C# .NET

Otevře se nám návrhář ovládacího prvku. Do prvku vložíme PictureBox. Celému prvku nastavíme v okně Properties vlastnosti Width na 200 a Height na 25. PicureBoxu dále nastavíme Location na 0;0, Width na 200, Height na 25 a Anchor na Top, Left, Bottom a Right, tedy všechny strany. Tímto zajistíme, že ovládací prvek bude mít rozměry 200×25 a při zvětšení se rozšíří i PictureBox, na který budeme později postup vykreslovat.

V Solution Exploreru klikneme na MujOvladaciPrvek.cs, a poté na Show Code. Přidáme vlastnosti MaxValue a Value typu int. Dále ještě vytvoříme privátní atribut MinValue, kterému nastavíme hodnotu 0. V setteru vlastností zavoláme ProgressBar_Paint(), jako první a druhý parametr předáme null. Tato metoda zatím neexistuje, později ji přidáme.

private int _value = 0;
public int Value
{
    get { return _value; }
    set { _value = value;  ProgressBar_Paint(null, null); }
}
private int minValue = 0;
private int _maxValue = 100;
public int maxValue
{
    get { return _maxValue; }
    set { _maxValue = value; ProgressBar_Paint(null, null); }
}

Dále přidáme metody Increment() a Decrement(), bez parametrů. Tyto metody i přetížíme, aby přijímaly jeden parametr - Value. V těchto metodách budeme inkrementovat (či dekrementovat) hodnotu progressbaru. Kód metod bude následující:

public void Increment(int Value)
{
    if (this.Value + Value > maxValue)
        throw new ArgumentOutOfRangeException("Hodnota překročila maximum");
    this.Value += Value;

}

public void Increment()
{
    if (this.Value + 1 > maxValue)
        throw new ArgumentOutOfRangeException("Hodnota překročila maximum");
    this.Value += Value;
}

public void Decrement(int Value)
{
    if (this.Value - Value < minValue)
        throw new ArgumentOutOfRangeException("Hodnota klesla pod minimum");
    this.Value -= Value;
}

public void Decrement()
{
    if (this.Value - 1 < minValue)
        throw new ArgumentOutOfRangeException("Hodnota klesla pod minimum");
    this.Value -= 1;
}

V každé z metod ověřujeme, jestli hodnota nepřesáhla maximum nebo minimum. Pokud ano, vyvoláme výjimku ArgumentOutOfRangeException. Pokud nová hodnota bude validní, tak ji přičteme nebo odečteme.

Nyní ještě musím progressbar překreslit, přesuneme se do okna návrháře. V okně Properties se přesuneme na události a k události Paint přiřadíme obslužnou metodu ProgressBar_Paint(). Přesuneme se do editoru kódu a do obsluhy ProgressBar_Paint() přidáme následující kód:

Graphics g = pictureBox1.CreateGraphics();
double vykreslovanaDelka = (double)this.Value * 100.0 / (double)maxValue / 100.0 * (double)this.Width;
g.Clear(Color.Green);
g.FillRectangle(Brushes.White, new Rectangle(0, 0, this.Width - int.Parse(vykreslovanaDelka.ToString()), 25));

Na prvním řádku deklarujeme grafiku PictureBoxu, na kterou budeme vykreslovat. Poté vypočítáme pomocí jednoduché trojčlenky velikost (v px), kterou musíme vykreslit, a pak ji vykreslíme od konce.

Nyní se přesuňme do formuláře. Dolů na formulář přidáme 2 tlačítka a jeden NumericUpDown. Tlačítkům dodáme text + a -, numericUpDown měnit nebudeme.

Tlačítka pro inkrementaci a dekrementaci - Windows Forms - Okenní aplikace v C# .NET

Implementace prvku

Z Toolboxu

Všimněte si, že v okně Toolboxu přibyla nová skupina <nazev projektu> Components. V této skupině se nachází pointer, který se automaticky přidává do každé skupiny a náš progressbar. S tímto progressbarem můžeme nyní zacházet jako s každým jiným ovládacím prvkem. Přetáhněme si nový progressBar do formuláře. Nyní se v našem formuláři nachází nový ovládací prvek.

Z kódu

Přesuňme se do kódu a ve formuláři si vytvořme privátní atribut prog typu MujProgressBar a hned jej inicializujeme. V konstruktoru mu nastavíme Location na 12;43 a přidáme jej do formuláře.

MujProgressBar prog = new MujProgressBar();
public Form1()
{
    InitializeComponent();
    prog.Location = new Point(12, 43);
    Controls.Add(prog);
}

Ještě přidáme obsluhy události pro obě tlačítka, která nám budou inkrementovat a dekrementovat progressbar.

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        if (numericUpDown1.Value > 1) {
            prog.Increment(int.Parse(numericUpDown1.Value.ToString()));
            mujProgressBar1.Increment(int.Parse(numericUpDown1.Value.ToString()));
        } else {
            prog.Increment();
            mujProgressBar1.Increment();
        }
    }
    catch (ArgumentOutOfRangeException ex)
    {
        MessageBox.Show(ex.Message);
    }

}

private void button2_Click(object sender, EventArgs e)
{
    try
    {
        if (numericUpDown1.Value > 1)
        {
            prog.Decrement(int.Parse(numericUpDown1.Value.ToString()));
            mujProgressBar1.Decrement(int.Parse(numericUpDown1.Value.ToString()));
        }
        else
        {
            prog.Decrement();
            mujProgressBar1.Decrement();
        }
    }
    catch (ArgumentOutOfRangeException ex)
    {
        MessageBox.Show(ex.Message);
    }
}

Program si vyzkoušejte, že funguje a progressbar se opravdu načítá odzadu.

Vlastní uživatelské prvky se hodí pro specifické věci, vytvářet si vlastní TextBox je asi nesmysl. Bylo by to to samé jako vynalézat znovu kolo. Ale pokud opravdu potřebujete nějaký prvek pro specifický účel, je to určitě správná volba.

V této lekci jste se naučili vytvářet vlastní ovládací prvky a naučili jste se je implementovat do programu. Také jste tím završili kurz Winforms a můžete pokračovat dalšími kurzy v předmětu C# .NET.

V následujícím kvízu, Kvíz - Windows Forms v C# .NET, si vyzkoušíme nabyté zkušenosti z kurzu.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 460x (92.41 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
Tvoříme vlastní Syntax Highlighter pomocí RichTextBox v C#
Všechny články v sekci
Windows Forms - Okenní aplikace v C# .NET
Přeskočit článek
(nedoporučujeme)
Kvíz - Windows Forms v C# .NET
Článek pro vás napsal Michal Žůrek - misaz
Avatar
Uživatelské hodnocení:
19 hlasů
Autor se věnuje tvorbě aplikací pro počítače, mobilní telefony, mikroprocesory a tvorbě webových stránek a webových aplikací. Nejraději programuje ve Visual Basicu a TypeScript. Ovládá HTML, CSS, JavaScript, TypeScript, C# a Visual Basic.
Aktivity