štvrtok, 16 apríl 2015 10:47 Written by 3335 times
Rate this item
(1 Vote)

C# - Ovládanie viacerých listboxov jedným tlačidlom

Malý príklad, malá formulárová aplikácia v C# - ako sa dá ovládať viac listboxov jedným tlačidlom.

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.

 

 

listbox



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

 

Last modified on štvrtok, 16 apríl 2015 11:47
Alojz Benďák

Autor je administrátor webu a venuje sa programovaniu takmer 23 rokov.

  • prvý kontakt s počítačmi na strednej škole - PMD 1,2,3, PP06, Atari, Sinclair (programovanie v jazyku: strojový kód, basic a pascal):  2 roky
  • na VŠ - jazyky Turbo pascal a Turbo C: 1rok
  • programovanie databázového ekonomického širokoškálneho software v Delphi a C++ Borland (databázy Paradox): 8 rokov v Codex s.r.o. Nitra
  • programovanie webových aplikácií na databázach MySQL a MS SQL server: 1 roky na živnosť (firmy: Hermes Nitra, Schindler v Bratislave)
  • pracoval ako DBA v Homecredit Brno a vo VÚB Bratislava ako vyvojár + optimalizácie v SQL a PL/SQL na Oracle 11g (firma Accenture)
  • programoval programy pre súkromné firmy pre HW na skenovanie povrchov nádrží pre skladovanie tekutých palív (pristroj Leica)
  • momentálne pracuje ako DBA pod Oracle 11g a ako vyvojár vnútropodnikových databázových aplikacií v PHP, SQL, C++, C# a interface v PL/SQL: 11 rokov
  • ďalej programuje s HTML, CSS, Ajax, Javascript, VBA, MS visual C++ a C# malé podporné aplikácie
  • certifikát SQL expert for Oracle 11g   
  • spolupracuje a aktívne učí pre počítačové firmy: Lapis, IVIT v Nitre