Avatar billede Heike Nybegynder
01. maj 2010 - 20:04 Der 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 ??

Håber der er nogen derude der kan hjælpe :)

Mvh Andreas
Avatar billede arne_v Ekspert
01. maj 2010 - 20:37 #1
simpel kode:

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;
Avatar billede arne_v Ekspert
01. maj 2010 - 20:38 #2
sidste linie skal naturligvis være:

val /= n;
Avatar billede lasserasch Juniormester
02. maj 2010 - 11:19 #3
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;




Mvh.
Lasse
Avatar billede Syska Mester
02. maj 2010 - 11:42 #4
og den if kunne laves:
if(ctrl is TextBox)
Avatar billede lasserasch Juniormester
02. maj 2010 - 12:04 #5
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 :-)
Avatar billede lasserasch Juniormester
02. maj 2010 - 12:04 #6
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];
Avatar billede lasserasch Juniormester
02. maj 2010 - 12:06 #7
Dobbelt post. Sorry
Avatar billede Heike Nybegynder
02. maj 2010 - 12:41 #8
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?
Avatar billede Syska Mester
02. maj 2010 - 12:52 #9
Ahhh, du skal nok lave et Panel ... og smide dine 3 TextBox'e derind.

Lige nu ... tager this.Controls alle textbox'e på din side ... derfor du nok får en for meget ...

mvh
Avatar billede lasserasch Juniormester
02. maj 2010 - 12:56 #10
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];
Avatar billede Heike Nybegynder
02. maj 2010 - 17:10 #11
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.


if (double.TryParse(textBox1.Text, out tal1))
{

n++;
resultat = (tal1 + tal2 + tal3 + tal4);
textBox5.Text = resultat.ToString();

}
else
{

n--;
resultat = ( + tal2 + tal3 + tal4);
textBox5.Text = resultat.ToString();
Avatar billede Syska Mester
02. maj 2010 - 17:22 #12
post hele din kode ...

www.nomorepasting.com

Jeg sidder i hvert fald lidt og gætter på hvad du reelt set prøver på.

mvh
Avatar billede Heike Nybegynder
02. maj 2010 - 17:57 #13
http://www.nomorepasting.com/getpaste.php?pasteid=32783

Dette var min første tanke til hvordan det kunne skrives.
Avatar billede Syska Mester
02. maj 2010 - 18:09 #14
Jeg kan ikke se meningen med det ...

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.
Avatar billede Syska Mester
02. maj 2010 - 18:20 #15
Ikke verdens flotteste kode, men her er et eksemple:

using System;
using System.Windows.Forms;

namespace AddTextboxesToLabel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            for(int i = 0; i < 4; i++)
            {
                TextBox box = new TextBox();
                box.Top = i*30;
                box.TextChanged += new EventHandler(box_TextChanged);
                Controls.Add(box);
            }
           
            L = new Label();
            L.Top = 4*30;
            L.Text = "result";
            Controls.Add(L);
        }

        public Label L { get; set; }
        void box_TextChanged(object sender, EventArgs e)
        {
            int count = 0;
            double sum = 0, value;

            foreach (var c in Controls)
            {
                if(c is TextBox)
                {
                   
                    if(double.TryParse(((TextBox)c).Text, out value))
                    {
                        count++;
                        sum += value;
                    }
                }
            }
            L.Text = (count == 0) ? "invalid" : (sum/count).ToString();
        }
    }
}
Avatar billede Heike Nybegynder
02. maj 2010 - 18:24 #16
Hmm. Jeg roder lidt rundt i det synes jeg også selv. Beklager.

Men som jeg tolker mit kode, så tages værdien fra textbox5 og lægges i tal5, som derefter bliver plusset med n.

Jeg forsøger jeres forslag igen - og ellers mange tak for svarene:)
Avatar billede Syska Mester
02. maj 2010 - 18:42 #17
ahh, ja, det overså jeg ...

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.

mvh
Avatar billede Heike Nybegynder
02. maj 2010 - 18:43 #18
Buzzzz, du er dagens helt!. Jeg siger mange tak:D, det er lige som det skal være.

En sidste ting, kan du forklare mig:

public Label L { get; set; }

og

foreach (var c in Controls)


Som du jo nok så ud fra mit kode er jeg stadig på et lavere plan:P.
Avatar billede Syska Mester
02. maj 2010 - 18:58 #19
Første er en Property:
http://www.c-sharpcorner.com/UploadFile/rajeshvs/PropertiesInCS11122005001040AM/PropertiesInCS.aspx

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 ...
Avatar billede Heike Nybegynder
02. maj 2010 - 19:06 #20
Jeg vil tjekke det ud:D..

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?
Avatar billede Syska Mester
02. maj 2010 - 19:34 #21
yes.
Avatar billede Heike Nybegynder
02. maj 2010 - 19:47 #22
Great. tak igen :P
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester