» »

[c#] textbox, vpis samo cifer, event _TextChanged, pika/vejica

[c#] textbox, vpis samo cifer, event _TextChanged, pika/vejica

japol ::

1. Kako naredim, da lahko uporabnik vpiše le cifre. Ker imam veliko textboxov,... ne želim imeti za vsakega if stavek, da preveri ali je vpisana cifra,...

2. Imam event za nek textbox, primer: private void textBox3_TextChanged(object sender, EventArgs e), takoj ko uporabnik naredi spremembo v njem, se sprotu popravlja izračun (podobno kot v Excelu). Problem je, ker je podatek lahko negativen in takoj ko vpiše znak minus, poskuša narediti izračun in zato javi napako. Kako to popravim?
Trenutno imam to rešeno tako:
 try
            {
                Izračun();
            }
            catch
            {
            }

znotraj catch ni nič
- saj deluje, mislim pa da ni to - to, in verjetno se da na bolj eleganten način narediti.

3. Decimalno ločilo pika/vejica. Primer programa sem poslal kolegu in on je dobil napačne rezultate, ker ima nastavljeno da je decimalno ločilo pika. Poskusil sem uporabiti ... = double.Parse (textBox1.Text, CultureInfo.InvariantCulture); ampak to ni v redu, ker želim da če ima uporabnik za decimalno ločilo nastavljeno vejico potem vpisuje vejico, če pa piko pa piko. V obeh primerih bi moral dobiti enak rezultat ampak ga ne. Kako to popravim?

klemen93 ::

1.
foreach(Control control in Controls)
{
  if(control.GetType() == typeof(TextBox))
  {
     float num;
     bool isNum = float.TryParse(control.Text, out num);
     if(!isNum) control.Text = "";
  }
}

2. Namest try/catch lahk daš:
 TextBox textBox = (TextBox)sender;
 if(textBox.Text[0] != '-') Izracun(); //predlagam ti da ne uporabljaš šumnikov pri programiranju


3. Če uporabnik vnese vejico, jo programsko spremen v piko.
 textBox1.Text = textBox1.Text.Replace(",", ".");


Niso ravno najbolj optimalne rešitve, ampak mislim da bi morale delovati.

darkolord ::

1. Naredi skupen event handle za Keypress, potem pa nanj priključi vse textboxe, za katere to želiš. Npr.:

        private void checkNumber(object sender, KeyPressEventArgs e)
        {
            e.Handled = !(Char.IsDigit(e.KeyChar) || e.KeyChar == '\b');
        }

// npr. v InitializeComponent:

            textBox1.KeyPress += checkNumber;
            textBox2.KeyPress += checkNumber;
            textBox3.KeyPress += checkNumber;



3. float.Parse() že uporabi tisto decimalno ločilo, ki ga ima uporabnik nastavljenega.

darkkk ::

1. & 2. Veliko classov ima metodo TryParse, podobno kot parse, le da prek reference nastavi sparsano vrednost, rezultat je pa bool ali je parsanje bilo uspešno.
Npr:
double num = 0;
bool rez = double.TryParse("1.22", out num);      //rez <- false, če imaš za dec. znak vejico, num ne uporabljaš 
rez = double.TryParse("1,22", out num); // rez <-true, num <- 1.22



Kot je uporabnik nad mano napisal, za handlanje "istih" eventov na enak način, samo nastavi vsem textboxom isti eventhandler. (Pomoje lahko samo 1. napišeš eventhandler na onChange, ostalim pa samo podtakneš isti handler noter prek propertyev v designerju) (odsvetujem packanje po InitializeComponent(), razen če točno veš kaj počneš)


3. če hočeš, da se uporabljajo vejice oz. pike za decimalno oznako tako, kot ima uporabnik nastavljeno, potem:
double.Parse(str, System.Globalization.NumberStyles.Number, System.Globalization.NumberFormatInfo.CurrentInfo);


Glede numberstyles imaš še nekaj svobode(zberi kar se ti zdi najbolj primerno), zadnji parameter mora biti currentInfo (pomoje je tole tudi default nastavitev).

Zgodovina sprememb…

  • spremenil: darkkk ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] try/catch, v katerem gradniku je napaka

Oddelek: Programiranje
101039 (777) japol
»

vb.net: dynamic textbox

Oddelek: Programiranje
51198 (1088) saule
»

c# class

Oddelek: Programiranje
342290 (1884) japol
»

C# Program

Oddelek: Programiranje
393117 (2040) Spura
»

[C#]Textbox ki dovoli samo številke

Oddelek: Programiranje
121368 (1232) darkolord

Več podobnih tem