Forum » Programiranje » [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:
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?
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.
2. Namest try/catch lahk daš:
3. Če uporabnik vnese vejico, jo programsko spremen v piko.
Niso ravno najbolj optimalne rešitve, ampak mislim da bi morale delovati.
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.:
3. float.Parse() že uporabi tisto decimalno ločilo, ki ga ima uporabnik nastavljenega.
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:
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:
Glede numberstyles imaš še nekaj svobode(zberi kar se ti zdi najbolj primerno), zadnji parameter mora biti currentInfo (pomoje je tole tudi default nastavitev).
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [c#] try/catch, v katerem gradniku je napakaOddelek: Programiranje | 1039 (777) | japol |
» | vb.net: dynamic textboxOddelek: Programiranje | 1198 (1088) | saule |
» | c# classOddelek: Programiranje | 2290 (1884) | japol |
» | C# ProgramOddelek: Programiranje | 3117 (2040) | Spura |
» | [C#]Textbox ki dovoli samo številkeOddelek: Programiranje | 1368 (1232) | darkolord |