[ west_herc @ 28.11.2006. 15:21 ] @
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
[ negyxo @ 28.11.2006. 16:18 ] @
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.
[ west_herc @ 28.11.2006. 20:25 ] @
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.
[ colke77 @ 29.11.2006. 09:03 ] @
Ja sam napravio custom kontroe koje su nasledjene iz TextBox kontrole, za ove potrebe
[ sstanko78 @ 29.11.2006. 09:32 ] @
ili vec gotove TextBoxKontrole koje imaju sve te osobine sto trazis :

http://www.codeproject.com/cs/.../ValidatingTextBoxControls.asp

i to sve sa source-om
[ bobanM @ 29.11.2006. 21:49 ] @
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.
[ logic_rabbit @ 30.11.2006. 14:04 ] @
Ja to odradjujem na validate textboxa.
[ Cola @ 05.11.2008. 19:58 ] @
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