Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Ogranicenje unosa double value u TextBox?!

[es] :: .NET :: .NET Desktop razvoj :: Ogranicenje unosa double value u TextBox?!

[ Pregleda: 4977 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
*.zrlocal.net.



+1 Profil

icon Ogranicenje unosa double value u TextBox?!23.01.2009. u 10:04 - pre 184 meseci
Imali neko neku ideju kako da ogranicim unos double value u TextBox? Potrebno mi je da omogucim unos samo brojeva u vidu tipa double(sa, ili bez decimalama), a da se pritom sve ostale opcije (mislim na Letter, Symbol,itd.) iskljuce. Ok, unos brojeva mogu ograniciti preko:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(char.IsNumber(e.KeyChar) || e.KeyChar == (Char)Keys.Back))
e.Handled = true;
}

, medjutim kako da ogranicim unos double tipa?!
Takodje, potrebno mi je i da obezbedim i zaokruzenje vrednosti tipa double na dve decimale prilikom unosa u bazu.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: Ogranicenje unosa double value u TextBox?!23.01.2009. u 10:48 - pre 184 meseci
Zaokruzivanje mozes postici tako sto u bazi dodelis polje tip Decimal sa 2 decimale preciznoscu
A onda ti double i ne treba .
Code:



if (textBox1.Text.Trim() != String.Empty) 
{

  try 
  {
     Decimal.Parse(txtBox.Text) ; 
     textBox1.BackColor = Color.White;
   }
    catch (Exception exc) 
    {
       txtBox1.Focus() ; 
       txtBox.BackColor= Color.Red ; 
    }
}
 

Ovaj kod stavi u handler kada tekst box izgubi fokus (Leave) i obojis ga u crveno ili mu setujes ponovo fokus
ako je korisnik uneo pogreesno da bi mogao da ispravi pre snimanja u bazu .
Moras jos dodatno voditi racuna o regional settingsu zbog razlicite reprezentacije decimalnih brojeva
tipa (1000,23) ili (3223.20)



Viva lollapalooza
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
*.zrlocal.net.



+1 Profil

icon Re: Ogranicenje unosa double value u TextBox?!23.01.2009. u 11:13 - pre 184 meseci
Tvoj predlog je ok ali u tabeli izborom decimal (2,0) on mi zaokruzuje na cele brojeve a meni je potrebno da ako se upise vrednost npr. 1.236 on zaokruzuje to na vrednost 1.24. Meni je potrebno da postoji decimalni broj sa dve decimale. Ono za handler je koristan predlog, ali opet ostaje pitanje kako da omogucim da se u textBoxu mogu samo kucati vrednosti tipa 123.98888, odnosno kako da omogucim da je moguce koristiti samo numericku tastaturu i tacku?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: Ogranicenje unosa double value u TextBox?!23.01.2009. u 12:53 - pre 184 meseci
Citat:

a meni je potrebno da ako se upise vrednost npr. 1.236 on zaokruzuje to na vrednost 1.24

Code:

Decimal dround  = Math.Round(Decimal.Parse(textBox1.Text),2); 


Citat:

odnosno kako da omogucim da je moguce koristiti samo numericku tastaturu i tacku?

IsNumeric,provera na numericku tacku, back i delete key mislim da ce biti dovoljno
Ako nije nijedno od ovoga => e.Handled = true; u tvojoj handler proc.


Viva lollapalooza
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
79.101.144.*

Jabber: DarkMan


Profil

icon Re: Ogranicenje unosa double value u TextBox?!23.01.2009. u 13:01 - pre 184 meseci
Vidi da li ti ovo zadovoljava tvoje potrebe:
Code:

    public class ControlHelpers
    {
        public static void SetupTextBoxKeyboardEvents(TextBoxBase textBox, TextBoxKeyboardEventType type)
        {
            if(textBox != null) {
                switch(type) {
                    case TextBoxKeyboardEventType.IntegerNumbers: textBox.KeyPress += new KeyPressEventHandler(textBox_KeyPress_IntegerNumbers); break;
                    case TextBoxKeyboardEventType.IntegerNumbersWithMinus: textBox.KeyPress += new KeyPressEventHandler(textBox_KeyPress_IntegerNumbersWithMinus); break;
                    case TextBoxKeyboardEventType.DecimalNumbers: textBox.KeyPress += new KeyPressEventHandler(textBox_KeyPress_DecimalNumbers); break;
                    case TextBoxKeyboardEventType.DecimalNumbersWithMinus: textBox.KeyPress += new KeyPressEventHandler(textBox_KeyPress_DecimalNumbersWithMinus); break;
                }
            }
        }

        private static void textBox_KeyPress_IntegerNumbers(object sender, KeyPressEventArgs e)
        {
            // Allow: ctrl+x (24), ctrl+c (3), ctrl+v (22)
            if((int)e.KeyChar == 3 || (int)e.KeyChar == 22 || (int)e.KeyChar == 24) return;
            if(!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)Keys.Back) e.Handled = true;
        }
        private static void textBox_KeyPress_IntegerNumbersWithMinus(object sender, KeyPressEventArgs e)
        {
            // Allow: ctrl+x (24), ctrl+c (3), ctrl+v (22)
            if((int)e.KeyChar == 3 || (int)e.KeyChar == 22 || (int)e.KeyChar == 24) return;
            if(!Char.IsDigit(e.KeyChar) && e.KeyChar != '-' && e.KeyChar != (char)Keys.Back) e.Handled = true;
            try {
                if(sender is TextBoxBase) {
                    if(e.KeyChar == '-' && ((TextBox)sender).SelectionStart != 0) e.Handled = true;
                } else if(sender is ComboBox) {
                    if(e.KeyChar == '-' && ((ComboBox)sender).SelectionStart != 0) e.Handled = true;
                }
            } catch { }
        }
        private static void textBox_KeyPress_DecimalNumbers(object sender, KeyPressEventArgs e)
        {
            // Allow: ctrl+x (24), ctrl+c (3), ctrl+v (22)
            if((int)e.KeyChar == 3 || (int)e.KeyChar == 22 || (int)e.KeyChar == 24) return;
            if(e.KeyChar == ',') e.KeyChar = '.';
            if(!Char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != (char)Keys.Back) e.Handled = true;
            try { if(e.KeyChar == '.' && ((Control)sender).Text.Contains(".")) e.Handled = true; } catch { }
        }
        private static void textBox_KeyPress_DecimalNumbersWithMinus(object sender, KeyPressEventArgs e)
        {
            // Allow: ctrl+x (24), ctrl+c (3), ctrl+v (22)
            if((int)e.KeyChar == 3 || (int)e.KeyChar == 22 || (int)e.KeyChar == 24) return;
            if(e.KeyChar == ',') e.KeyChar = '.';
            if(!Char.IsDigit(e.KeyChar) && e.KeyChar != '-' && e.KeyChar != '.' && e.KeyChar != (char)Keys.Back) e.Handled = true;
            try { if(e.KeyChar == '.' && ((Control)sender).Text.Contains(".")) e.Handled = true; } catch { }
            try {
                if(sender is TextBoxBase) {
                    if(e.KeyChar == '-' && ((TextBoxBase)sender).SelectionStart != 0) e.Handled = true;
                } else if(sender is ComboBox) {
                    if(e.KeyChar == '-' && ((ComboBox)sender).SelectionStart != 0) e.Handled = true;
                }
            } catch { }
        }
    }
    public enum TextBoxKeyboardEventType
    {
        Default = 0,
        IntegerNumbers,
        IntegerNumbersWithMinus,
        DecimalNumbers,
        DecimalNumbersWithMinus,
        Text
    }
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
212.200.180.*



+1 Profil

icon Re: Ogranicenje unosa double value u TextBox?!25.01.2009. u 18:06 - pre 184 meseci
Ok, sve ovo sto je pod ovom temom moze se u neku ruku iskoristiti, ali sada shvatam, nakon daljeg razvoja aplikacije, da mi je ustvari potrebno, ne ogranicenje unosa, nego provera validacije izraza. Primera radi, klijentu omogucavam da sve unosi, ako hoce i slova u textBox1, ali kada klikne na dugme Unos tada mu se pojavljuje MessageBox sa porukom o neispravnom unosu vrednosti i taj textBox1 se uokviruje ctrveno. Naime, meni je potrebno da kada korisnik klikne na dugme Unos program odradi proveru unetog izraza. Taj izraz bi trebalo da ima oblik decimalnog broja. Takodje, nakon zavrsetka ove provere potrebno je i da se ta decimalna vrednost postavi u oblik sa dve decimale/zaokruzi (npr. ako je uneti broj u obliku 12.3456 da se on u bazu unese kao 12.35, ili ako je u obliku 12 da se onda postavi u oblik 12.00). I jos jedno pitanje kako da postavim da mi u SQL bazi tip unosa vrednosti bude decimalna vrednost sa dve decimale? Koju god opcioju sam odabrao u SQL 2005 bazi uvek mi je unetu vrednost automatski zaokruzivao na cele brojeve. Npr. u tabeli baze direkno upisem 150.34 a on mi automatski to pretvori u 150 i tako ga cuva. Kako taj deo da resim? Da li cu morati da odaberem neki tekstualni tip podataka pa da ustvari brojeve iz textBox-a u tom obliku da cuvam u bazi, mada mislim da bi to bila ludost?! Imali za mene neko nekakav predlog rada?

PS-da li neko zna zbog cega ovo ne prolazi:
if(text.Box1 == "")
{
label1.Visible = false;
}
else
{
if(decimal.Parse(textBox1.Text) < 150)
{
label1.Visible = true;
label1.Text = "LOW";
}
else
{
if(Decimal.Parse(text.Box1.Text) >170)
{
label1.Visible = true;
label1.Text = "HIGH";
}
else
{
label1.visible = false;
}
}
}

Sve funkcionise ok dok ne ukucam decimalnu tacku i neki broj nakon tacke. Npr. ja upisem u textBox1 149 i on ispise LOW ali kada mu upisem 149.1 on napise HIGH. Zasto?! Da li i decimalne brojeve kao i datume moram preko funkcije Compare() da poredim?
Mislim da su sad to sva pitanja koja su me mucila tokom vikenda
 
Odgovor na temu

Igor Gajic

Član broj: 93194
Poruke: 747
79.101.198.*



+987 Profil

icon Re: Ogranicenje unosa double value u TextBox?!26.01.2009. u 15:04 - pre 184 meseci
Ubaci brakepoint na liniju:


if(decimal.Parse(textBox1.Text) < 150)

i u watch ubaci izraz:

decimal.Parse(textBox1.Text)

i pogledaj koju vrednost ti vraca. Cini mi se da je problem u regionalnim podesavanjima i kako je definisan separator za hiljade.

Tj. 150.4 tretira kao 150400.
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
212.200.180.*



+1 Profil

icon Re: Ogranicenje unosa double value u TextBox?!26.01.2009. u 18:32 - pre 184 meseci
Probao sam sa watch i ustanovio sam da on "." ne konta nikakao, odnosno ona kao da ne postoji. Ako ja upisem broj 10.2, on to vidi kao 102. Ako upisem 10.23 on to vidi kao 1023. U cemu je greska ako sam unos textBox definisao kao:
public void unos_Vrednosti
{
if(e.KeyChar == ',') e.KeyChar = '.';
if(!Char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != (char)Keys.Back)
e.Handled = true;
try
{
if(e.KeyChar == '.' && ((Control)sender).Text.Contains(".")) e.Handled = true;
}
catch { }
}

Kako bih mogao onaj deo oko validacije izraza, koji sam ranije pomenuo, mogao da odradim?
 
Odgovor na temu

sallle
Sasa Ninkovic
GTECH
Beograd

Član broj: 146
Poruke: 480
91.148.84.*

ICQ: 20785904


+4 Profil

icon Re: Ogranicenje unosa double value u TextBox?!26.01.2009. u 23:59 - pre 184 meseci
taj parse je culture sensitive (pa od toga verovatno zavisi kako ce da tumaci ',' a kako '.').

Ono sto ce tebi najelegantnije da radi posao su regularni izrazi.

System.Text.RegularExpressions
Regex class

tvoj reg izraz bi izgledao nesto tipa: \d+([.,]\d+){0,1}

a kod bi bio nesto tipa:

Regex rgx = new Regex(@"\d+([.,]\d+){0,1}");
Match m = rgx.Match(ulazniString);
if (m.Value == ulazniString)
...
 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
*.zrlocal.net.



+1 Profil

icon Re: Ogranicenje unosa double value u TextBox?!27.01.2009. u 12:34 - pre 184 meseci
Sallle tvoj primer mi savrseno odradi deo koji se odnosi na validaciju upisa, ali nikako mi ne pomaze oko poredjenja vrednosti izmedju textBox.Text i decimalnog broja. Kako bi mogao da resim problem oko culture sensitive jer upravo mi to pravi problem, na jednom racunaru radi ok, a na drugom ne? Da li mozda ti imas neki drugi nacin/ideju na koji bi mogao to poredjenje realizovati?
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
93.86.83.*

Jabber: DarkMan


Profil

icon Re: Ogranicenje unosa double value u TextBox?!27.01.2009. u 12:53 - pre 184 meseci
One handlere za TextBox, sto sam ranije napisao, ce ti obezbediti da korisnik moze uneti samo jednu tacku za decimalne brojeve (ako unese zarez tretirace ga kao tacku). Kada si obezbedio da unos ima uvek isti format mozes parsirati na sledeci nacin:

Code:

string text = "112.35";
double result = double.Parse(text, System.Globalization.CultureInfo.InvariantCulture);


Sto se tice tipa polja u bazi koristi decimal(m,n) gde ti je m ukupan broj cifara zajedno sa decimalama, a n je broj decimala.
Na primer decimal(5,2) koristis za procente jer obezbedjuje unos 100.00 (ukupno 5 cifara a od toga su 2 decimale).



 
Odgovor na temu

sallle
Sasa Ninkovic
GTECH
Beograd

Član broj: 146
Poruke: 480
91.148.84.*

ICQ: 20785904


+4 Profil

icon Re: Ogranicenje unosa double value u TextBox?!27.01.2009. u 23:44 - pre 184 meseci
Probaj 'vako nesto. I ako neces da budes culture sensitive (ni na nivou treda), zakucaj koji ti je decimalni separator (unutar ovih nuberstyles mozes dozvoljavas groupseparatore i jos neke fore...)
Code:

System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = '.';
double br1;
double br2;
if (double.TryParse(ulaz1, System.Globalization.NumberStyles.Number, nfi, out br1) && double.TryParse(ulaz2, System.Globalization.NumberStyles.Number, nfi, out br2) 
{
 //br1 i br2 sadrze vrednosti 
  

else
{
//nije dobar format stringova ulaz1 i/ili ulaz2
}



 
Odgovor na temu

bigguy
borisav ignjatov
nista
zrenjanin

Član broj: 87859
Poruke: 267
*.zrlocal.net.



+1 Profil

icon Re: Ogranicenje unosa double value u TextBox?!28.01.2009. u 07:00 - pre 184 meseci
Momci hvala na predlozima od velike su mi koristi, ali ostalo mi je jos samo jedno pitanje. Kako da resim problem zaokruzivanja vrednosti sa 12.45678 na 12.46? Nebih ogranicavao unos podataka u textBox na odredjen broj cifara, nego bih klikom na dugme Unos pre nego sto se podaci uskladiste u bazu automatski kod trebao sam da odsece visak cifara i da na poslednju cifru uradi +1 ako je odseceni ostatak >5 ili +0 ako je <=5. Predpostavljam da se vec neko pozabavio ovim problemom jer i nije bas da je tako redak problem?!
 
Odgovor na temu

[es] :: .NET :: .NET Desktop razvoj :: Ogranicenje unosa double value u TextBox?!

[ Pregleda: 4977 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.