01. maj 2010 - 20:04Der er
21 kommentarer og 1 løsning
Beregn kun hvis textbox indeholder værdi
Hej
Jeg er ny i C# og står med et program, som indeholder en række textboxe hvori der skal skrives tal i. Disse tal skal plusses sammen og divideres med antallet af textboxe som der er skrevet en værdi i. Altså programmet indeholdet fire textboxe, hvori der kun er tal i de tre af dem, programmet skal altså her kun dividere med tre.
Jeg benytter mig af (int.TryParse(textBox1.Text, out tal1))
Hvordan kan dette lettet løses? jeg har tidligere kigget på muligheden med en counter (i++) men her lægges der yderligere tal til counteren ved jo flere decimaler der skrives på i textboxene. Kan man indsætte et flag som derved kun tæller én gang ??
int val = 0; int n = 0; int tal; if(int.TryParse(textBox1.Text, out tal)) { val += tal; n++; } if(int.TryParse(textBox2.Text, out tal)) { val += tal; n++; } if(int.TryParse(textBox3.Text, out tal)) { val += tal; n++; } if(int.TryParse(textBox4.Text, out tal)) { val += tal; n++; } val /= tal;
Hvis der er flere tekstbokse så kunne man gøre det endnu smartere med mindre kode sådan her:
int val = 0; int n = 0; int tal = 0; foreach (Control ctrl in this.Controls) { if (ctrl.GetType() == typeof(TextBox)) { if (int.TryParse(((TextBox)ctrl).Text, out tal)) { val += tal; n++; } } } val /= n;
Variablerne kunne også lægges ind i et array for at spare 2 linjer mere...
int[] vars = new int[3]; foreach (Control ctrl in this.Controls) { if (ctrl is TextBox) { if (int.TryParse(((TextBox)ctrl).Text, out vars[2])) { vars[0] += vars[2]; vars[1]++; } } } vars[0] /= vars[1];
Man skal i hvert fald ikke sige at vi ikke går ind for kodeoptimering :-)
int[] vars = new int[3]; foreach (Control ctrl in this.Controls) { if (ctrl is TextBox) { if (int.TryParse(((TextBox)ctrl).Text, out vars[2])) { vars[0] += vars[2]; vars[1]++; } } } vars[0] /= vars[1];
Mange tak for de mange forslag, jeg har fået testet det I har fået skrevet, og det virker også efter hensigten, indtil der skrives flere decimaler ind i en textbox, så er det at den tæller en ekstra op, også hvis der er mere end to decimaler der slettes.
Er det mig der er helt væk og ikke kan gennemskue det gode arbejde i har lavet eller :P?
Som jeg forstår det, så virker det ikke i det øjeblik hvor der ikke bruges heltal længere.
Dvs. hvis du taster 1,2 i en tekst boks, så springer den denne over i løkken.
Prøv at bruge double i stedet for.
double[] vars = new double[3]; foreach (Control ctrl in this.Controls) { if (ctrl is TextBox) { if (double.TryParse((((TextBox)ctrl)).Text, out vars[2])) { vars[0] += vars[2]; vars[1]++; } } } vars[0] /= vars[1];
Hmm. Synes ikke det ændres. Den lægger stadig 1 til når der skrives eller slettes værdier både ved double og int.
Jeg havde selv fået nedskrevet dette forinden jeg oprettede mit indlæg her, og som det ses tælles én ned hvis den ingen værdier indeholder, dog tæller den også en op hvis der skrives større end 9 som er hoved problemet.
Du gør jo ikke som du har skrevet i dit spørgsmål ...
tal5 er altid 0, da du ikke laver nogen assignment til den.
Problemer er også lidt logikken ... hvis du taster noget ind, og det ikke kan parses som et tal ... trykker du en fra ... hvis du skriver "fem" ... har du fået 5 textchanged events og n vil være minus 5.
slet det hele giver en changed event. men stadig intet talm, så nu er den minus 6, så skriver du "4" og nu er den 5 igen.
Håber du kan se problemet.
Gør som vi har skrevet ... men lav din textbox5 om til en Label ... og skriv resultatet der.
Men end hvad du præcist prøver på ... så skal vi nok finde ud af det.
Men de tal vil have en forkert værdi. TextChanged bliver jo kaldt mange gange ... altså hver gang teksten ændre sig, så alt efter hvor mange fejl man laver til at starte med vil du kunne få et meget negativt tal .. eller positiv hvis du bare skriver gyldige tal hele tiden, så vil den jo gå mod uendelig.
Google kan give meget bedre forklaring end jeg sådan lige kan. Men se det som en måde at opbevare data på, ligesom fields.
foreach kører bare igennem alle controls på Formen. Vær dog opmærksom på at hvis du tilføjer flere TextBox vil den også tage dem med. Så kan ske du skal tilføje en Container til dem du vil loop over ... eller smide dem i din egen liste.
Men der er mange muligheder for hvordan det kan laves ...
Men hvis der skal tilføjes flere textboxe til formen som nødvendigvis ikke skal tælles med, kan de boxe der skal regnes med så indsættes i et panel, som du nævnte længere oppe?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.