Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 7 odgovora
  • 5.804 pregleda

Najnovija ↓

textbox kontrola unosa 28.11.2006. u 16:21 · pre 242 meseca #1
Na koji način kontrolirate TextBox. Tj ako unesem float number u textbox ili ako unesem bilo koji broj u textbox da on javi grešku da se tu može unijet samo text. Naravno i obratno.

Hvala
Re: textbox kontrola unosa 28.11.2006. u 17:18 · pre 242 meseca #2
Code:

public class TextBoxEx : TextBox
    {
        public enum TextBoxExFilterType : byte
        {
            NoFilter,
            WholeNumber,
            DecimalNumber,
            PositiveWholeNumber,
            PositiveDecimalNumber,
            NegativeWholeNumber,
            NegativeDecimalNumber,
            CustomFilter
        }

        bool _changeInPorgress = false;
        byte _decimalPlaces = 255;
        string _currentFilterPattern = string.Empty;
        string _customFilterPattern = string.Empty;        
        TextBoxExFilterType _filterType = TextBoxExFilterType.NoFilter;

        public TextBoxEx()
        {            
        }

        protected override void OnEnter(EventArgs e)
        {
            this.SelectionStart = 0;
            this.SelectionLength = this.Text.Length;
            
            base.OnEnter(e);
        }

        protected override void OnTextChanged(EventArgs e)
        {
            if (_filterType == TextBoxExFilterType.NoFilter)
                goto End;

            if (_changeInPorgress)
            {                
                _changeInPorgress = false;
                goto End;
            }

            Regex regex = new Regex(_currentFilterPattern);
            string match = regex.Match(this.Text).Value;
            if (match != this.Text)            
            {
                _changeInPorgress = true;
                this.Text = match;            
            }

            End:
                base.OnTextChanged(e);
        }

        // ovo je da se ne bi cuo onaj glubi beep kada se pritisne enter
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if (e.KeyCode == Keys.Enter)
                e.SuppressKeyPress = true;
        }


        protected override void OnKeyPress(KeyPressEventArgs e)
        {            
            if (e.KeyChar == '\b' || _filterType == TextBoxExFilterType.NoFilter)
                goto End;

            StringBuilder sb = new StringBuilder();
            sb.Append(this.Text.Substring(0, this.SelectionStart));
            sb.Append(e.KeyChar);
            sb.Append(this.Text.Substring(this.SelectionStart + this.SelectionLength));
            string text = sb.ToString();

            Regex regex = new Regex(_currentFilterPattern);

            if (regex.Match(text).Value != text)
            {
                e.Handled = true;
                System.Media.SystemSounds.Beep.Play();
            }
            else
                _changeInPorgress = true;

            End:
                base.OnKeyPress(e);
        }        

        [Category("Filter")]
        [DefaultValue(TextBoxEx.TextBoxExFilterType.NoFilter)]
        public TextBoxExFilterType FilterType
        {
            get
            {
                return _filterType;
            }
            set
            {
                _filterType = value;
                _currentFilterPattern = GetFilterPattern(_filterType, _decimalPlaces);
                
                //refresh
                Regex regex = new Regex(_currentFilterPattern);
                this.Text = regex.Match(this.Text).Value;
            }
        }

        [Category("Filter")]
        [DefaultValue("")]        
        public string CustomFilter
        {
            get
            {
                return _customFilterPattern;
            }
            set
            {
                _customFilterPattern = value;
                if (_filterType == TextBoxExFilterType.CustomFilter)
                {
                    _currentFilterPattern = _customFilterPattern;
                    //refresh
                    Regex regex = new Regex(_currentFilterPattern);
                    this.Text = regex.Match(this.Text).Value;
                }
            }
        }

        [Category("Filter")]
        [DefaultValue((byte)255)]        
        public byte DecimaPlaces
        {
            get
            {
                return _decimalPlaces;
            }
            set
            {
                if (value < 1)
                {
                    throw new Exception("Decimal places can not be smaller then 1.");
                }
                _decimalPlaces = value;
                _currentFilterPattern = GetFilterPattern(_filterType, _decimalPlaces);
                
                //refresh
                Regex regex = new Regex(_currentFilterPattern);
                this.Text = regex.Match(this.Text).Value;
            }    
        }

        string GetFilterPattern(TextBoxExFilterType filter, byte decimalPlaces)
        {
            NumberFormatInfo nfi = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat;

            switch (filter)
            {
                case TextBoxExFilterType.NoFilter:
                    return "";

                case TextBoxExFilterType.WholeNumber:
                    return @"[" + nfi.NegativeSign + @"]?\d*";

                case TextBoxExFilterType.DecimalNumber:
                    return @"[" + nfi.NegativeSign + @"]?\d*[" + nfi.NumberDecimalSeparator + @"]?\d{0," + decimalPlaces.ToString() + "}";

                case TextBoxExFilterType.NegativeWholeNumber:
                    return @"[" + nfi.NegativeSign + @"]\d*";

                case TextBoxExFilterType.NegativeDecimalNumber:
                    return @"[" + nfi.NegativeSign + @"]\d*[" + nfi.NumberDecimalSeparator + @"]?\d{0," + decimalPlaces.ToString() + "}";

                case TextBoxExFilterType.PositiveWholeNumber:
                    return @"\d*";

                case TextBoxExFilterType.PositiveDecimalNumber:
                    return @"\d*[" + nfi.NumberDecimalSeparator + @"]?\d{0," + decimalPlaces.ToString() + "}";

                case TextBoxExFilterType.CustomFilter:
                    return _customFilterPattern;
            }

            return "";
        }
    }

Evo ti cela kontrola.
Re: textbox kontrola unosa 28.11.2006. u 21:25 · pre 242 meseca #3
Neznam za ovo, ali mislim da postoji nešto lakše za korištenje. MASKED TEXTBOX, da se izbjegne logika programiranja uvjeta nego je već sve urađeno.
Re: textbox kontrola unosa 29.11.2006. u 10:03 · pre 242 meseca #4
Ja sam napravio custom kontroe koje su nasledjene iz TextBox kontrole, za ove potrebe
Potpis
Idemo dalje
Re: textbox kontrola unosa 29.11.2006. u 22:49 · pre 242 meseca #6
Ako imas potrebu da cesto koristis ovu proveru prilikom unosa, onda je najbolje da poslusas savet od negyxo.

Ako ti treba resenje na brzinu onda west_herc ti je dao super brzo resenje.

Jedino bih predlozio da se u celu pricu iskoristi OnValidating event zajedno sa ErrorProvider-om. Recimo da u datom dogadjaju proveris da li je uneti text validan, ako nije dodaj error text u error provider. Sve to stavis u try catch blok i time na brzinu dobijes resenje koje "lepo izgleda". Mada sam vise za resenje koje je dao negyxo.
Potpis
nije lepo da budem lud a da to ne znam
Re: textbox kontrola unosa 30.11.2006. u 15:04 · pre 242 meseca #7
Ja to odradjujem na validate textboxa.
Potpis
logic_rabbit (MCAD,MCSD,MCT,MCTS-
Windows development,MCPD)
Re: textbox kontrola unosa 05.11.2008. u 20:58 · pre 219 meseci #8
nije loše ovo gore!!!
Ovih dana pokušavam da skontam i da isprogramiram neke validatore :)

Pokušavam da napravim ValidtingManager koji u sebi ima ErrorProvider da prikazuje poruke za datu kontrolu.

Sve to zasad lepo radi ali imam jedan problem, trnutno u ValidatingManagaru imam fukciju koja služi da kontroli postavim Validating

Code:

class ValidtingManager {
    ...
    public static void AddVlidation(Control p_control, CancelEventHandler p_ceh)
    {
      ...
      p_control.Validating += p_ceh;
    }


ok i to radi validacija se poziva kada se uđe na kontrolu (uli izlazi mrzi me sada da gledam u help)

Međutim ako se ne prođe preko kontrole validacija se neće pozvati!!!

kako ja da izvršim Validating neke kontrole????

Ovo mi npr treba kada želim da izvršim validaciju cele forme, jer možda su neka polja obavezna a nisu unesena pa ima se zato nije pozvala validating metoda

Na kraju mi je cilj da napravim ValidatingManager kome ću definisati funkcije like ove

public void AddValidating(Control p_control, funkcija_po_kojoj_se_validira)
sorry ne znam kako se ovo prosleđuju delegati ili funkcije pa ovako pišem ali bitan je smisao
Funkcija bi trebala da:
- doda funkcija_po_kojoj_se_validira na Validating prosleđene kontrole
- zapamti sve dodane p_control

public bool ValidateAll()
Funkcija bi trebala da:
- izvrši validaciju svih kontrola koje su dodane i da vrati ukupan rezultat validacije

...

U ovoj klasi napravio bi pool već nekih predefinisanih funkcija za validaciju (EmptyValidator, EmailValidator, NumberValidator raznih vrsta, ...)
tako da bi u konstrukroru neke konkretne forme potrebno bilo samo dodati sledeće npr
Code:

public Form1()
    {
      InitializeComponent();
      _validationManager = new ValidationManager();
      _validationManager.AddVlidation(textBox1, f1);
      _validationManager.AddVlidation(textBox2, f2);
      ...
      _validationManager.AddVlidation(textBoxn, fn);
    }

gde su f1, f2, ... fn funkcije po kojima se validira (bilo iz navedenog pool-a ili neka korisnički definisana)
i validacija gotova

E ostaje mi samo da dobojem odgovor na dva pitanja

1. Kako da ja izvršim Control.Validating ????
2. hehe ima li ko ideju kako da prosledim funkcije :)

Hvala
Potpis
http://www.knjigaimena.com
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme