Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

17. diel - Vlastné ovládacie prvky v C # .NET

V predchádzajúcich 4 lekciách sme pracovali so základnými ovládacími prvkami, ktoré ponúka sám .NET Framework. Toto počínanie sme dovŕšili lekcií Ovládacie prvky Windows Forms štvrtýkrát . Asi však uznáte, že nie sú všemocné a skrátka a dobre nestačí na všetko. Dnes sa v C# tutoriálu pozrieme na tvorbu vlastných ovládacích prvkov.

Predstavme si, že potrebujeme urobiť progressbar, ktorý sa bude načítať odzadu. Výsledok bude vyzerať asi nejako takto:

Progressbar načítaný naopak - Okenné aplikácie v C # .NET vo Windows Forms

ProgresBar bude teda celkom obyčajný, len sa bude načítať sprava doľava.

Pridanie prvku do projektu

V Solution Exploreri klikneme pravým tlačidlom myši na projekt a zvolíme Add New Item. V dialógu Add New Item vyberieme šablónu User Control, ovládací prvok pomenujeme MujProgressBar.cs.

Add New Item – User Control - Okenné aplikácie v C # .NET vo Windows Forms

Otvorí sa nám návrhár ovládacieho prvku. Do prvku vložíme PictureBox. Celému prvku nastavíme v okne Properties vlastnosti Width na 200 a Height na 25. PicureBox u ďalej nastavíme Location na 0;0, Width na 200, Height na 25 a Anchor na Top, Left, Bottom a Right, teda všetky strany. Týmto zaistíme, že ovládací prvok bude mať rozmery 200 × 25 a pri zväčšení sa rozšíri aj PictureBox, na ktorý budeme neskôr postup vykresľovať.

V Solution Exploreri klikneme na MujOvladaciPrvek.cs, a potom na Show Code. Pridáme vlastnosti MaxValue a Value typu int. Ďalej ešte vytvoríme privátne atribút MinValue, ktorému nastavíme hodnotu 0. V Setter vlastností zavoláme ProgressBar_Paint(), ako prvý a druhý parameter odovzdáme null. Táto metóda zatiaľ neexistuje, neskôr ju pridá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); }
}

Ďalej pridáme metódy Increment() a Decrement(), bez parametrov. Tieto metódy i preťažíme, aby prijímali jeden parameter - Value. V týchto metódach budeme inkrementovať (či dekrementovat) hodnotu lište. Kód metód bude nasledujúce:

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ždej z metód overujeme, či hodnota nepresiahla maximum alebo minimum. Ak áno, vyvoláme výnimku ArgumentOutOfRangeException. Ak nová hodnota bude validný, tak ju pripočítame alebo odčítame.

Teraz ešte musím progressbar prekresliť, presunieme sa do okna návrhára. V okne Properties sa presunieme na udalosti a na udalosti Paint priradíme obslužnú metódu ProgressBar_Paint(). Presunieme sa do editora kódu a do obsluhy ProgressBar_Paint() pridáme nasledujúci 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 prvom riadku deklarujeme grafiku PictureBox u, na ktorú budeme vykresľovať. Potom vypočítame pomocou jednoduchej trojčlenka veľkosť (v px), ktorú musíme vykresliť, a potom ju vykreslíme od konca.

Teraz sa presuňme do formulára. Nadol na formulár pridáme 2 tlačidlá a jeden NumericUpDown. Tlačidlám dodáme text + a -, numericUpDown meniť nebudeme.

Tlačidlá pre inkrementácia a dekrementace - Okenné aplikácie v C # .NET vo Windows Forms

Implementácia prvku

Z Toolbox

Všimnite si, že v okne Toolbox pribudla nová skupina <nazev projektu> Components. V tejto skupine sa nachádza pointer, ktorý sa automaticky pridáva do každej skupiny a náš progressbar. S týmto progressbar môžeme teraz zaobchádzať ako s každým iným ovládacím prvkom. Pretiahnite si nový progressbar do formulára. Teraz sa v našom formulári nachádza nový ovládací prvok.

Z kódu

Presuňme sa do kódu a vo formulári si vytvorme privátne atribút prog typu MujProgressBar a hneď ho inicializujeme. V konstruktoru mu nastavíme Location na 12;43 a pridáme ho do formulára.

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

Ešte pridáme obsluhy udalosti pre obe tlačidlá, ktoré nám budú inkrementovať 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 vyskúšajte, že funguje a progressbar sa naozaj načítava odzadu.

Vlastné užívateľské prvky sa hodí pre špecifické veci, vytvárať si vlastné TextBox je asi nezmysel. Bolo by to to isté ako vynájsť znovu koleso. Ale ak naozaj potrebujete nejaký prvok pre špecifický účel, je to určite správna voľba.

V tejto lekcii ste sa naučili vytvárať vlastné ovládacie prvky a naučili ste sa ich implementovať do programu. Tiež ste tým zavŕšili kurz WinForms a môžete pokračovať ďalšími kurzy v predmete C# .NET.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 461x (92.41 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Ovládacie prvky Windows Forms štvrtýkrát
Všetky články v sekcii
Okenné aplikácie v C # .NET vo Windows Forms
Článok pre vás napísal Michal Žůrek - misaz
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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