Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 09:49 Der er 35 kommentarer

Regning med tekstboxe.

Hej eksperter.

Jeg har et problem som jeg håber at kan få lidt hjælp til. Jeg har en textbox hvori jeg vil beregne en total ud fra nogle andre textboxe. Jeg har en textbox der hedder antal, rabat og pris pr/stk. Regnestykket for totalen skal se således ud:

(antal*pris)-((antal*pris)*rabat)

Problemet er ikke at regne det ud for en eneklt textbox. Jeg har en masse textboxe som er sat op i samme rækkefølge (pris, antal, rabat,pris ialt). Men jeg vil gerne undgå at komme til at lave en KÆMPE løkke for at få beregnet alle boxene.

Koden ser således ud for en enkelt box:

private string udregn()
        {
            return ((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))-(((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))*decimal.Parse(tbRabat.Text)))).ToString("0.00");
        }

Der er dog nogle problemer med den. Hvis et af felterne ikke er udfyldt så bliver det null og programmet fejler. (I må gerne komme med en løsning på dette også :)
Jeg vil så gerne have hjælp til at programmet generelt udregner for hvert felt (tbPris1, tbPris2, tbPris3, ........ tbPrisn), hvis nogetr er indtastet i nogle af felterne.

Håber det er forståeligt! Og håber i kan hjælpe, om end så bare med en lille del af det. Alt vil være til stor hjælp!

Mvh

Martin Sørensen
Avatar billede kalp Novice
14. oktober 2007 - 10:35 #1
Nu drejer det sig kun om et par felter så du kan du lave et tjek på om de er null først før du laver din udregning..

f.eks

if(string.IsEmptyOrNull(tbAntal.Text))
{
  tbAntal.Text = "0";
}

dette tjek laver du for alle felter.
Avatar billede dr_chaos Nybegynder
14. oktober 2007 - 11:03 #2
Den pæneste løsning er noget i denne stil:
private string udregn()
{
decimal dtbAntal = decimal.Parse(t((string.IsNullOrEmpty(tbAntal.Text)) ? "0" : tbAntal.Text));
decimal dtbPrisStk = decimal.Parse(t((string.IsNullOrEmpty(tbPrisStk.Text)) ? "0" : tbPrisStk.Text));
decimal dtbRabat = decimal.Parse(t((string.IsNullOrEmpty(tbRabat.Text)) ? "0" : tbRabat.Text));

  return ((dtbAntal * dtbPrisStk )-(((dtbAntal * dtbPrisStk )*dtbRabat ))).ToString("0.00");
    }

Der kan være kompiler fejl :)
Avatar billede kalp Novice
14. oktober 2007 - 11:07 #3
den pænere er vel at bruge decimal.TryParse;)
Avatar billede dr_chaos Nybegynder
14. oktober 2007 - 12:34 #4
Nej den bruger vidst en exception til at finde ud af om det en decimal.
Så det er en dårlig løsning.
Avatar billede kalp Novice
14. oktober 2007 - 13:06 #5
den kaster ikke en exception
Avatar billede dr_chaos Nybegynder
14. oktober 2007 - 15:00 #6
Jeg ved godt at den ikke kaster en exception umidelbart.

Min antagelse var at den underliggende lavede en

try
{
decimal.parse(string);
}
catch(Exception e)
{
//et eller andet.
}

Nu har jeg kigget lidt i system dll'en og set at det gør den ikke.

Jeg troede at den fungerede lige som IsDate funktionen, men det gjorde den ikke.
Avatar billede kalp Novice
14. oktober 2007 - 16:12 #7
okay:)
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 18:09 #8
Tak for jeres svar. Kan godt se ideen med at tjekke det først. Men problemet er at man kan oprette uendelig mange tekstboxe, så det bliver lidt omfattende. Jeg havde tænkt mig noget i stil med at tjekke navnet på texboxen, og tælle dem, noget i stil med dette:

for(int i = 0; i < antal textboxe ; i++)
{
(decimal.Parse(tbAntal + i.Text)* decimal.Parse(tbPrisStk + i.Text))-(((decimal.Parse(tbAntal + i.Text)* decimal.Parse(tbPrisStk + i.Text))*decimal.Parse(tbRabat + i.Text))).ToString("0.00");
}

Så bare for hver textbox. Men ved ikke om en sådan en funktion eller løsning overhovedet er mulig. ved godt denne kode ovenfor overhovedet ikke er mulig. Men det er for at illustrere mit problem :)

Mvh
Avatar billede kalp Novice
14. oktober 2007 - 18:45 #9
Opret nedenstående metode..

private void ClearEmpty(Control controls)
{
            foreach (Control control in controls.Controls)
            {
                amount += recursiveMethod(control);
                TextBox textbox = control as TextBox;
                if(textbox == null) continue;
                textbox.Text = "0";
            }
}

og ret din egen til

private string udregn()
        {
ClearEmpty(this);
            return ((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))-(((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))*decimal.Parse(tbRabat.Text)))).ToString("0.00");
        }


så kan der være tusinde og det vil aldrig være et problem.
Avatar billede kalp Novice
14. oktober 2007 - 18:46 #10
private void ClearEmpty(Control controls)
{
            foreach (Control control in controls.Controls)
            {
                ClearEmpty(control);
                TextBox textbox = control as TextBox;
                if(textbox == null) continue;
                textbox.Text = "0";
            }
}

sorry.. sådan der..

faktisk endda dig som fik den metode i
http://www.eksperten.dk/spm/800605
hehe
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:00 #11
Ja :) Men kan ikke helt forstå hvad der sker... Kun lige! er det muligt du gider smide noget kommentar, så vil jeg blive virkelig glad :D

Mvh
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:02 #12
den brokker sig over void :(
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:10 #13
Havde sat en } for meget og forkert. Og der skulle lige tilføjes en

decmial amount = 0;

Men nu er problemet væk med null.. Men mit egentlige problem er at jeg har ligesom i excel, en masse linjer bestående af 5 textboxe i hver. tbPris1, tbPris2 ..... osv. er der hvor det hele skal ligges sammen. Men skal jeg så lave en funktion for hver enkelt felt, altså en:

private string udregn()
        {
ClearEmpty(this);
            return ((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))-(((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))*decimal.Parse(tbRabat.Text)))).ToString("0.00");
        }
Med alle textbox navnene, eller kan jeg lave en form for tæller der tæller navnet på textboxen, da jeg nu har kaldt dem tbPris1, tbPrsi2.....?
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:16 #14
Hvad for en skal jeg pege på med kanppen. udregn eller ClearEmpty?
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:25 #15
Bare en af dem er null skriver den 0 i ALLE textboxe

:(
Avatar billede kalp Novice
14. oktober 2007 - 19:26 #16
hov sorry..

private void ClearEmpty(Control controls)
{
            foreach (Control control in controls.Controls)
            {
                ClearEmpty(control);
                TextBox textbox = control as TextBox;
                if(textbox != null) continue;
                textbox.Text = "0";
            }
}
Avatar billede kalp Novice
14. oktober 2007 - 19:27 #17
og så som du har gjort her

private string udregn()
        {
ClearEmpty(this);
            return ((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))-(((decimal.Parse(tbAntal.Text)* decimal.Parse(tbPrisStk.Text))*decimal.Parse(tbRabat.Text)))).ToString("0.00");
        }

Det er korrekt nok.. :)

Metoden ClearEmpty er en rekursiv metode som kalder sig selv
Avatar billede kalp Novice
14. oktober 2007 - 19:29 #18
hmm.. jeg sover måske lidt

private void ClearEmpty(Control controls)
{
            foreach (Control control in controls.Controls)
            {
                ClearEmpty(control);
                TextBox textbox = control as TextBox;
                if(textbox == null) continue;
                if(string.IsEmptyOrNull(textbox.Text))
{
  textbox.Text = "0";
}
            }
}
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:31 #19
Kalp, Må jeg sende dig en beskrivelse med billeder og tekst til dig så jeg kan forklare mit problem? Og du kender helt sikkert en nemmere metode til at løse mit problem på! Og den kode du lig har sendt sender:

System.NullReferenceException was unhandled
textbox.Text = "0"; --->  Object reference not set to an instance of an object.
Avatar billede kalp Novice
14. oktober 2007 - 19:32 #20
Ja jeg beklager.. mig som sov.. men det virker med den sidste jeg skrev:)
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:35 #21
:) og det er  if (string.IsNullOrEmpty(textbox.Text)) og ikke

if(string.IsEmptyOrNull(textbox.Text)) ;)

Men skriver stadig 0 i resten af boxene. Men må jeg sende dig en beskrivelse af mit problem med billeder og tekst til dig på mail evt? For er virkelig kørt fast, og kan ikke forklare mig ordentligt hvad problemet er?

MVH
Avatar billede kalp Novice
14. oktober 2007 - 19:39 #22
okay jeg skriver det fra hukommelsen hehe..
jeg er helt med på din problemstilling - som er at den fejler hvis du ikke indtaster noget i en af tekst boksene, men den sidste metode burde ikke skrive "0" i de textboxe som ikke er tomme.. den tjekker jo netop på det:)

så skal det være fordi der er en bug i den "IsNullOrEmpty" og det tvivler jeg på.

men du kan da prøve

if(textbox.Text.Trim() == "")
{
  textbox.Text = "0";
}

den kan alligevel aldrig være null.
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 19:53 #23
Jep, virker nu! ;)

Men det var ikke det der var mit problem, og grunden til jeg skrev dette indlæg. Mit problem er:

Jeg har lavet en tabel, kan man sige, af tekstboxe. Jeg har en antal, pris/stk og rabat. Det bliver regnet sammen i en box der hedder pris. Jeg har intet problem med at få det til at virke på én linje, altså med

//Navne på tekstboxe i linjen.
tbAntal1
tbStkPris1
tbRabat1

Og så bruger jeg:

((decimal.Parse(tbAntal1.Text)* decimal.Parse(tbStkPris1.Text))-(((decimal.Parse(tbAntal1.Text)* decimal.Parse(tbStkPris1.Text))*decimal.Parse(tbRabat1.Text))).ToString("0.00");

Men problemet er jeg også har en linje med:

//Navne på tekstboxe i linjen.
tbAntal2
tbStkPris2
tbRabat2

og så videre med det antal linjer der er oprettet. (17 i mit tilfælde).

Så var problemet om jeg skal lave den udregning for hvert eneste felt (tbPris 1,2,3....) eller om jeg kan lave en løkke som bare sætter et tal bagpå f.eks tbStkPris + tal +. Så når brugeren indtaster informationerne i textboxene regner den automatisk resultatet i tbPris(n). Så har jeg en box hvori der bliver regner summen af alle tbPris som hedder tbIalt. Håber det er til at forstå, men det er virkelig nemmere at forstå med et billede!

Mvh

Og 1000 tak for hjælpen so far!!!!
Avatar billede kalp Novice
14. oktober 2007 - 19:56 #24
hvis dit problem er at du ikke gider gøre sådan her 17 gange så forstår jeg dig godt.

((decimal.Parse(tbAntal1.Text)* decimal.Parse(tbStkPris1.Text))-(((decimal.Parse(tbAntal1.Text)* decimal.Parse(tbStkPris1.Text))*decimal.Parse(tbRabat1.Text))).ToString("0.00");

og så selvfølgelig erstatte 1 tallet for de 1-17 ..
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 20:02 #25
det er nemlig mit problem, lige præcis :)

Så det ikke bliver sådan her:

tbPris1.Text = ((decimal.Parse(tbAntal1.Text)* decimal.Parse(tbStkPris1.Text))-(((decimal.Parse(tbAntal1.Text)* decimal.Parse(tbStkPris1.Text))*decimal.Parse(tbRabat1.Text))).ToString("0.00");

tbPris2.Text = ((decimal.Parse(tbAntal2.Text)* decimal.Parse(tbStkPris2.Text))-(((decimal.Parse(tbAntal2.Text)* decimal.Parse(tbStkPris2.Text))*decimal.Parse(tbRabat2.Text))).ToString("0.00");

Og så er det meningen at bruger skal kunne oprette nye textboxe/linjer alt efter hvor mange han skal bruge.

Er der en løsning på det, eller er det den hårde vej. Eller er der en anden "model" for hvordan man kan regne sådan noget ud?

Mvh
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 20:03 #26
ligesom i excel, der kan man jo bare trække ned, Så ved den i hvilke felter den skal regne.
Avatar billede kalp Novice
14. oktober 2007 - 20:09 #27
jeg bliver lige nød til, at tænke over den.. jeg arbejder primært med ASP.NET hvor man kan lave FindControl og på den måde finde elementer smart.
men det samme gælder ikke lige for Windows forms..

men tænker lige:)
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 20:12 #28
TAK!!! :)
Avatar billede kalp Novice
14. oktober 2007 - 20:32 #29
Jeg kunne ikke komme frem til en nem måde, at gøre det på.

Du bliver nok nød til, at gøre så din metode private string udregn() modtager 3 parametre(3 textboxe) og som den så laver din udregn på.
Avatar billede martinsorensen Nybegynder
14. oktober 2007 - 20:34 #30
Havde jeg leget lidt med! ;) Men tusind tak for hjælpen! Det er virkelig fedt! tak for det!

Mvh
Avatar billede kalp Novice
14. oktober 2007 - 20:47 #31
hov sorry.. selvfølgelig ikke textboxene.. bare deres værdier:P
Avatar billede martinsorensen Nybegynder
29. oktober 2007 - 15:00 #32
Dr chaos. Smid svar, brugte din løsning som virker perfekt
Avatar billede martinsorensen Nybegynder
29. oktober 2007 - 15:15 #33
også kalp brugte også ideer fra dig :)
Avatar billede kalp Novice
29. oktober 2007 - 15:17 #34
:)
Avatar billede dr_chaos Nybegynder
29. oktober 2007 - 22:05 #35
svar :)
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