Komponenty v jazyce C#

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: sukovanej
Datum: 27.9.2012
Hodnocení/Hlasovalo: 2/3

Práce s komponentami je v prostředí Visual Studia víceméně klikací záležitostí. Co se ale přesně děje na pozadí a lze tyto komponenty přidávat dynamicky?

Název trochu nabádající k tomu, že komponenty má na svědomí samotný jazyk. Tyto komponenty lze ale podle stejných praktik použít i třeba v jazyku VB.Net. Za těmito komponentami stojí samotný .Net

Vytvoření nové okenní aplikace

Začněme nejdříve tím, že si vytvoříme novou aplikaci podle šablony Windows Forms Application. Po otevření projektu pravděpodobně uvidíte klasické okno s titulkem a typickými rozměry. V prostředí Designér potom tyto vlastnosti můžeme jednoduše spravovat pomocí okna Properties. Pokud v tomto panelu změníme některou jeho vlastnost, hned se to projeví v okně s formulářem.

Tyto vlastnosti ovšem musí být někde zapsány zdrojovým kódem v jazyce C#. Kompilátor by si s tím jinak neporadil (nepočítám WPF, kde je pro editaci vzhledu k dispozici jazyk XAML).

Jeden soubor vládne všem...

Vše se odehrává v souboru s označením (za předpokladu, že se náš formulář jmenuje Form1) Form1.Designer.cs, který nalezneme v okně Solution Explorer po rozkliknutí položky Form1.cs. Když tento soubor otevřeme, bude nás zajímat hlavně metoda InitializeComponent(). V této metodě je zapsáno, jaké komponenty a s jakými vlastnostmi se mají přidat do fomuláře při jeho spuštění.

private void InitializeComponent()
{
	this.SuspendLayout();
	// 
	// Form1
	// 
	this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
	this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
	this.ClientSize = new System.Drawing.Size(484, 462);
	this.Name = "Form1";
	this.Text = "Hlavní formulář";
	this.ResumeLayout(false);
}

Ze zdrojového kódu výše by mělo být vše jasné, ale aby to bylo ještě více intuitivní, zkusme na formulář přidat tlačítko (Button) a sledujme změny v souboru Form1.Designer.cs...

private void InitializeComponent()
{
	this.button1 = new System.Windows.Forms.Button();
	this.SuspendLayout();
	// 
	// button1
	// 
	this.button1.Location = new System.Drawing.Point(13, 13);
	this.button1.Name = "button1";
	this.button1.Size = new System.Drawing.Size(75, 23);
	this.button1.TabIndex = 0;
	this.button1.Text = "button1";
	this.button1.UseVisualStyleBackColor = true;
	// 
	// Form1
	// 
	this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
	this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
	this.ClientSize = new System.Drawing.Size(484, 462);
	this.Controls.Add(this.button1);
	this.Name = "Form1";
	this.Text = "Hlavní formulář";
	this.ResumeLayout(false);

}

//Velice důležitý je zde také řádek :
private System.Windows.Forms.Button button1;

Roz(h)řešení

Vše co Designér ve Visual Studiu dělá je to, že definuje novou instanci příslušné třídy, čili Button (System.Windows.Forms.Button). Definuje některé jeho potřebné vlastnosti jako Text, Name a Size a na řádku níže ho přidá do kolekce Controls formuláře Form1.

this.Controls.Add(this.button1);

Přidáváme komponenty za běhu aplikace

Komponentu na formulář přidáme tak, že vytvoříme instanci příslušné třídy komponenty. Potom definujeme některé důležité vlastnosti a přidáme do kolekce Controls příslušného objektu (v tomto konkrétním případě je to formulář Form1). Za předpokladu, že toto víme, není žádný problém přidat komponentu i za běhu aplikace.

private void button1_Click(object sender, EventArgs e)
{
	TextBox textBox = new TextBox();
	textBox.Size = new Size(150, 30);
	textBox.Location = new Point(10, 10);
	textBox.Name = "textBox";

	this.Controls.Add(textBox);
}

Pokud bychom chtěli generovat těchto komponent více, udělali bychom to například tak, že bychom si definovali pomocnou proměnnou typu int. Její počáteční hodnota by byla rovna nule. Při každém kliknutí na tlačítko bychom ji zvětšili o jedničku (inkrementace). Pozici komponenty bychom také generovali dynamicky, jinak bychom nic neviděli. Nakonec ještě upravíme vlastnost Name a budeme jí předáva dynamickou hodnotu podle hodnoty naší proměnné.

int i = 0; //Pomocná proměnná

private void button1_Click(object sender, EventArgs e)
{
	TextBox textBox = new TextBox();
	textBox.Size = new Size(150, 30);
	textBox.Location = new Point(10, 10 + i * 30);
	textBox.Name = "textBox" + i.ToString();

	this.Controls.Add(textBox);
	
	i++;
}

Závěr

V tomto krátkém článku jsem chtěl ukázat, že za klikajícím prostředím Visual Studia se skrývá regulérní zdrojový kód. Není třeba se ho nějak bát a díky jeho znalosti dokonce lze komponenty generovat i za běhu programu !