Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:08 Der er 39 kommentarer og
1 løsning

Løkke

Hej eksperter.

Vil gerne tælle mine textbox'e, lave det der står i dem til double og derefter ligge dem sammen.

Jeg har prøvet:

for(i=0; i<16; i++)
{
double ialt =+ Convert.ToDouble(tbPris+i.Text);
}

Men det virker ikke. :(

Jeg har skrevet i<16 fordi der er 16 textboxe. Og jeg har kaldt dem tbPris1, tbPris2, tbPris3 ..... tbPris16

Håber i kan hjælpe.

Med venlig hilsen

Martin
Avatar billede nielle Nybegynder
11. oktober 2007 - 20:19 #1
double ialt = 0;
for(i=0; i<16; i++)
{
ialt =+ Convert.ToDouble(tbPris+i.Text);
}
Avatar billede arne_v Ekspert
11. oktober 2007 - 20:22 #2
Proev noget a la:

            decimal ialt = 0;
            foreach(Control c in Controls)
            {
                if(c is TextBox)
                {
                    if(c.Name.IndexOf("tbPris") == 0)
                    {
                        ialt += decimal.Parse(((TextBox)c).Text);
                    }
                }
            }
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:24 #3
Error    2    The name 'tbPris' does not exist in the current context    C:\revision\WindowsApplication1\WindowsApplication1\Form2.cs    54    42    WindowsApplication1

Jeg tror at den ikke godtager +i inde i et navn?
Avatar billede nielle Nybegynder
11. oktober 2007 - 20:26 #4
Nej, var lige for hurtig der.

Det skal også vær som arne angiver. Dog nok lige me3d en try-catch om Parse-delen.
Avatar billede nielle Nybegynder
11. oktober 2007 - 20:28 #5
decimal ialt = 0;
            foreach (Control c in Controls)
            {
                if (c is TextBox)
                {
                    if (c.Name.IndexOf("tbPris") == 0)
                    {
                        try
                        {
                            ialt += decimal.Parse(((TextBox)c).Text);
                        }
                        catch { }
                    }
                }
            }

            MessageBox.Show("Sum: " + ialt);
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:30 #6
Hej arne. Den kunne i compaile nu. Men den ligger dem desværre ikke sammen: Du får lige koden :)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        double ialt = 0;

        public Form2()
        {
            InitializeComponent();
            this.Text = "Revision v 1.0 beta - Faktura";

            timer1 = new Timer();
            timer1.Interval = 100;
            timer1.Start();
            timer1.Tick += new EventHandler(Timer_Tick);
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }



        public void Timer_Tick(object sender, EventArgs eArgs)
        {

            if (sender == timer1)
            {
                //
                //Beregner ialt feltet.
                //
                decimal dtbIalt = belobIAlt();
                string stbIalt = Convert.ToString(dtbIalt);
                tbIalt.Text = stbIalt;
            }
            Invalidate();
        }

        public decimal belobIAlt()
        {

            decimal ialt = 0;
            foreach (Control c in Controls)
            {
                if (c is TextBox)
                {
                    if (c.Name.IndexOf("tbPris") == 0)
                    {
                        ialt += decimal.Parse(((TextBox)c).Text);
                    }
                }
            }
            return ialt;
           
        }
 
    }

   
}
Avatar billede arne_v Ekspert
11. oktober 2007 - 20:33 #7
Hvad sker der ? exception ? 0.00 ?
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:35 #8
Nielle: Alt virker, men den skriver at summen er = 0 :(
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:37 #9
Arne v: Der sker bare ingen ting. Med nielle message.show viser den i en messagebox
sum: 0
Avatar billede nielle Nybegynder
11. oktober 2007 - 20:37 #10
Kunn e det tænkes at dine textboxe ikke hedder "tbPris..." ?

En anden mulighed er at du har lagt dem inde i et panel?
Avatar billede arne_v Ekspert
11. oktober 2007 - 20:38 #11
Check Name property paa dine TextBox'e, maaske hedder de textBox7 etc..
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:38 #12
Ja, de ligger inde i et panel
Avatar billede arne_v Ekspert
11. oktober 2007 - 20:38 #13
Hvis de goer saa aendre dem til at hedde det de skal.
Avatar billede nielle Nybegynder
11. oktober 2007 - 20:39 #14
Ahhh panel - et øjeblik :^)
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:40 #15
Skal jeg smide dem ud af det? (det vil jeg helst ikke). Mit panel/gruopbox hedder:

groupBox2
Avatar billede nielle Nybegynder
11. oktober 2007 - 20:43 #16
Ikke nødvendig:

Sådan:

        public decimal belobIAlt(Control c1)
        {
            decimal ialt = 0;
            foreach (Control c2 in c1.Controls)
            {
                if (c2 is TextBox)
                {
                    if (c2.Name.IndexOf("tbPris") == 0)
                    {
                        try
                        {
                            ialt += decimal.Parse(((TextBox)c2).Text);
                        }
                        catch { }
                    }
                }
                else if (c2 is Panel)
                {
                    ialt += belobIAlt(c2);
                }
            }

            return ialt;
        }

og sådan:

        public void Timer_Tick(object sender, EventArgs eArgs)
        {

            if (sender == timer1)
            {
                //
                //Beregner ialt feltet.
                //
                decimal dtbIalt = belobIAlt(this);
                string stbIalt = Convert.ToString(dtbIalt);
                tbIalt.Text = stbIalt;
            }
            Invalidate();
        }
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:50 #17
Nielle: Viser stadig 0. Men det er en groupBox alle boxene ligger i. Og der er 16 forskellige. Giver lige koden som den er nu:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        double ialt = 0;

        public Form2()
        {
            InitializeComponent();
            this.Text = "Revision v 1.0 beta - Faktura";

            timer1 = new Timer();
            timer1.Interval = 100;
            timer1.Start();
            timer1.Tick += new EventHandler(Timer_Tick);
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }



        public void Timer_Tick(object sender, EventArgs eArgs)
        {

            if (sender == timer1)
            {
                //
                //Beregner ialt feltet.
                //
                decimal dtbIalt = belobIAlt(this);
                string stbIalt = Convert.ToString(dtbIalt);
                tbIalt.Text = stbIalt;
            }
            Invalidate();
        }

        public decimal belobIAlt(Control c1)
        {
            decimal ialt = 0;
            foreach (Control c2 in c1.Controls)
            {
                if (c2 is TextBox)
                {
                    if (c2.Name.IndexOf("tbPris") == 0)
                    {
                        try
                        {
                            ialt += decimal.Parse(((TextBox)c2).Text);
                        }
                        catch { }
                    }
                }
                else if (c2 is GroupBox)
                {
                    ialt += belobIAlt(c2);
                }
            }

            return ialt;
        }
    }

   
}
Avatar billede nielle Nybegynder
11. oktober 2007 - 20:54 #18
Løsningen er da heldigvis let at udvide:

        public decimal belobIAlt(Control c1)
        {
            decimal ialt = 0;
            foreach (Control c2 in c1.Controls)
            {
                if (c2 is TextBox)
                {
                    if (c2.Name.IndexOf("tbPris") == 0)
                    {
                        try
                        {
                            ialt += decimal.Parse(((TextBox)c2).Text);
                        }
                        catch { }
                    }
                }
                else if (c2 is Panel)
                {
                    ialt += belobIAlt(c2);
                }
                else if (c2 is GroupBox)
                {
                    ialt += belobIAlt(c2);
                }
            }

            return ialt;
        }
Avatar billede arne_v Ekspert
11. oktober 2007 - 20:54 #19
Hvordan ser form koden ud ?
Avatar billede kalp Novice
11. oktober 2007 - 20:55 #20
prøv den her:)

private decimal recursiveMethod(Control controls)
        {
            decimal amount = 0;
            foreach (Control control in controls.Controls)
            {
                amount += recursiveMethod(control);
                TextBox textbox = control as TextBox;
                if(textbox == null) continue;
                try
                {
                    amount += decimal.Parse(textbox.Text.Trim());
                }
                catch { }
            }
            return amount;
        }


og


public void Timer_Tick(object sender, EventArgs eArgs)
        {

            if (sender == timer1)
            {
                //
                //Beregner ialt feltet.
                //
                decimal dtbIalt = recursiveMethod(this);
                string stbIalt = Convert.ToString(dtbIalt);
                tbIalt.Text = stbIalt;
            }
            Invalidate();
        }
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:55 #21
JAAAAAA, Tager lige en runde rundt om blokken ;D DET VIRKER!!! TAKKKK!!! jeg er i himlen :D
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:56 #22
Send et svar så du kan få nogle point!
Avatar billede kalp Novice
11. oktober 2007 - 20:57 #23
Jeg tror ikke, at du har benyttet min metode, men den burde virke uanset om dine textboxe placeret i paneler eller andra kontroller.
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 20:59 #24
Nielle, din løsning er rigtig! Kalp din virker også delvist, Den bliver ved med at ligge sammen hvert sekund
Avatar billede nielle Nybegynder
11. oktober 2007 - 21:00 #25
Jep, den er faktisk lidt mere elegant, men den skal nu lige udvides med et ekstra tjek på navnet af textboxene da summen ellers ville blive forkert.
Avatar billede kalp Novice
11. oktober 2007 - 21:00 #26
okay martin, men det er noget helt andet;)
selve logikken i min er nok mere sikker, men it's your call.. du kan frit benytte koden;o)
Avatar billede kalp Novice
11. oktober 2007 - 21:01 #27
nielle -> korrekt:) jeg kom til at fokusere på, at gøre den generisk, men det er en mindre detalje:P
Avatar billede nielle Nybegynder
11. oktober 2007 - 21:02 #28
private decimal recursiveMethod(Control controls)
        {
            decimal amount = 0;
            foreach (Control control in controls.Controls)
            {
                amount += recursiveMethod(control);

                TextBox textbox = control as TextBox;
                if (textbox == null ||
                    !textbox.Name.StartsWith("tbPris")) continue;
                try
                {
                    amount += decimal.Parse(textbox.Text.Trim());
                }
                catch { }
            }
            return amount;
        }
Avatar billede martinsorensen Nybegynder
11. oktober 2007 - 21:03 #29
Jeg syntes begge er geniale ;) Jeg siger RIGTIGT mange tak! Og jeg kan KALP din kan jeg bruge et andet sted i mit program, til et problem jeg heller ikke lige kunne løse, så det virker nu! :D

Virkelig godt! 100000 TAK til jer alle ! :D
Avatar billede nielle Nybegynder
11. oktober 2007 - 21:04 #30
Er det ikke bare en 3-vejs deler denne her?
Avatar billede kalp Novice
11. oktober 2007 - 21:10 #31
Det er okay:)
Jeg kan godt lide, at pusle med rekursiv kode:P
Avatar billede nielle Nybegynder
11. oktober 2007 - 21:11 #32
Du kunne nu have ventet til de andre to havde lagt et svar :^)

http://www.eksperten.dk/spm/800612
Avatar billede nielle Nybegynder
11. oktober 2007 - 21:23 #33
Der er nu noget magisk ved rekursion ;^)

        private decimal CalcSum(Control control)
        {
            if (control is TextBox)
            {
                if (control.Name.StartsWith("tbPris"))
                {
                    try { return decimal.Parse(control.Text.Trim()); }
                    catch { }
                }
                return 0;
            }
            else
            {
                decimal sum = 0;
                foreach (Control childControl in control.Controls)
                {
                    sum += CalcSum(childControl);
                }
                return sum;
            }
        }
Avatar billede arne_v Ekspert
11. oktober 2007 - 22:32 #34
Note: det var ikke et tilfaelde at jeg valgte decimal fremfor double. Det strengt forbudt
at bruge float eller double til beloeb.
Avatar billede nielle Nybegynder
11. oktober 2007 - 22:35 #35
I hvert fald hvis man er fra den financielle sektor - de kan ikke lide afrundingdfejl!
Avatar billede arne_v Ekspert
12. oktober 2007 - 01:18 #36
Forhåbentligt er der også andre brancher hvor man ikke er glade for det.
Avatar billede bvli Praktikant
12. oktober 2007 - 01:47 #37
Gu' ve' hvordan de mon så har det med tomme "catch-clauses" i parsningen :x

(Til trådstarter: I stedet for at ligge og rode med en timer der ligger og kører hver 1/10 sekund, kunne man prøve at overveje en eventbaseret løsning i stedet)

/B :)
Avatar billede arne_v Ekspert
13. oktober 2007 - 18:17 #38
Jeg ville nok ikke lave den catch (jeg lavede ikke den catch).

At et ikke udfyldt felt tælles som 0 er vel helt fint.

Men hvis folk skriver teksten "fjorten" i feltet er det nok tvivlsomt om de forventer
at det bliver talt som 0 uden advarsler.

Man kunne putte noget i den catch.

Men jeg ville føle det mere fristende at have noget "kun tal" kode andet steds
og så lade en exception her ryge langt op og blive betragtet som en kode bøf
i validerings koden.
Avatar billede kalp Novice
13. oktober 2007 - 20:22 #39
tjah.. jeg lavede try catch af ren dovenskab...
problemet i fokus var, at udregningen slet ikke kom med.
Exception håndtering er et helt andet kapitel.

men i hvertfald så kan man fra .NET 2.0 og op benytte sig af decimal.TryParse metoden da den ikke kaster en exception.
Avatar billede arne_v Ekspert
14. oktober 2007 - 02:52 #40
Problem stillingen er stadig den samme.
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