Podmienky:
- predpokladám u programátora základné znalosti z C# a objektového programovania
- programovacie prostredie: Microsoft Visual Studio 2010
- nastavenie projektu:
- New project: Windows Form Application
- Namespace: Listbox
- Assemblyname: Listbox
Projekt som nazval "Listbox". Hlavný obsah zdrojového kódu je uložený v súbore Form1.cs. V prílohe sú ďalšie súbory Form1.Designer.cs a Program.cs.
Na formulári sú vložené 3 objekty triedy listbox. Listbox je objekt, ktorý vie uskladniť pole reťazcov a zároveň ich aj užívateľovi na formulári zobrazovať. Naša úloha je naprogramovať ovládanie všetkych troch listboxov jednými spoločnými tlačidlami. Tlačidlom "Add" - pridať novú položku do listboxu, tlačidlom "Edit" - zmeniť položku v listboxe a tlačidlom "Delete" - vymazať položku v listboxe.
Áno, úloha je v podstate jednoduchá. Každý ako tak zbehlý programátor v C# naprogramuje takýto program jednoducho. Každú akciu v tlačidle by napríklad vypodmienkoval, zistil, ktorý listbox je aktívny, a potom v príslušnej vetve programu spustil akciu pre aktívny listbox naprogramovanú zvlášť.
Ja chcem ale demonštrovať iný spôsob, ako jednoducho túto úlohu zvládnuť. Nechcem prácne programovať pre každý listbox tú istú akciu zvlášť. Preto som si vyvtoril privátnu metódu "Set_active_object", ktorá mi nastaví do ukazovateľov na objekt listbox a textbox (" Active_listbox","Active_textbox"), že ktorý objekt je aktívny. Všetky páry listbox-textbox sú zviazané medzi sebou pomocou vlastnosti "Tag", ktorá je vyplnená v konštruktore formulára. Viď zdrojový subor Form1.cs. Metoda "Set_active_object" je volaná v príslušných metódach na zaktívnenie objektu na klik myšou na objekt (na stlačenie klávesnice si doprogramujete sami) a to v spoločných metódach pre "mousedown" pre všetky listboxy a "mousedown" pre všetky textboxy. Potom už v spoločných akciách ("button_add_Click"," button_edit_Click","button_delete_Click") jednotlivých tlačidiel pracujem s aktívnymi ukazovateľmi smerujúcich na aktívne objekty a ovládam ich. Krátke štúdium zdrojového súboru Form1.cs dopovie za mňa všetko ostatné:)
Kód v c#:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Listbox { public partial class Form1 : Form { private System.Windows.Forms.ListBox Active_listbox; private System.Windows.Forms.TextBox Active_textbox; private void Set_active_objects(object o) { if (o is System.Windows.Forms.TextBox) { this.Active_textbox = (System.Windows.Forms.TextBox)o; this.Active_listbox = (System.Windows.Forms.ListBox) this.Active_textbox.Tag; } else if (o is System.Windows.Forms.ListBox) { this.Active_listbox = (System.Windows.Forms.ListBox)o; this.Active_textbox = (System.Windows.Forms.TextBox)this.Active_listbox.Tag; } } public Form1() { InitializeComponent(); this.textBox1.Tag = this.listBox1; this.listBox1.Tag = this.textBox1; this.textBox2.Tag = this.listBox2; this.listBox2.Tag = this.textBox2; this.textBox3.Tag = this.listBox3; this.listBox3.Tag = this.textBox3; Set_active_objects(this.textBox1); } private void button_add_Click(object sender, EventArgs e) { if (this.Active_textbox.Text.Length > 0) { this.Active_listbox.Items.Add(this.Active_textbox.Text); this.button_edit.Enabled = this.button_delete.Enabled = false; this.Active_textbox.SelectAll(); this.Active_textbox.Focus(); } } private void button_edit_Click(object sender, EventArgs e) { if (this.Active_listbox.SelectedIndex >= 0) { this.Active_listbox.Items[this.Active_listbox.SelectedIndex] = this.Active_textbox.Text; } } private void button_delete_Click(object sender, EventArgs e) { int selectedIndex = this.Active_listbox.SelectedIndex; if (selectedIndex >= 0) { this.Active_listbox.Items.RemoveAt(selectedIndex); this.Active_textbox.Text = ""; if (this.Active_listbox.Items.Count > 0) { if (selectedIndex < this.Active_listbox.Items.Count) { this.Active_listbox.SelectedIndex = selectedIndex < this.Active_listbox.Items.Count ? selectedIndex : this.Active_listbox.Items.Count - 1; } this.listBox_MouseDown(this.Active_listbox, null); } else this.button_edit.Enabled = this.button_delete.Enabled = false; } } private void Form1_Activated(object sender, EventArgs e) { this.textBox1.Select(); Set_active_objects(this.textBox1); } private void listBox_MouseDown(object sender, MouseEventArgs e) { Set_active_objects(sender); if (this.Active_listbox.SelectedIndex >= 0) { this.Active_textbox.Text = this.Active_listbox.Items[this.Active_listbox.SelectedIndex].ToString(); this.button_edit.Enabled = this.button_delete.Enabled = true; } } private void textBox_MouseDown(object sender, MouseEventArgs e) { Set_active_objects(sender); } } }
Príjemnú zábavu.
S pozdravom