Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 10:18 Der er 35 kommentarer og
1 løsning

Genbrug af kode til textboxe i windows forms

Hej eksperter. Jeg har skrevet følgende kode:

        private string udregn1()
        {
            string stbRabat = "";

            // Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0.
            // hvis ja, skriver den en notify da boxen ikke må være tom.
            if (string.IsNullOrEmpty(tbBeskr1.Text) && !string.IsNullOrEmpty(tbAntal1.Text) || !string.IsNullOrEmpty(tbStkPris1.Text))
            {
                NotifyWindow nw = new NotifyWindow("OBS!",
                "Der er ikke skrevet nogen varebeskrivelse i linje 1.");
                nw.Notify();
                tbBeskr1.Focus();// Placere markøren i textboxen.
            }
            else { }
            //
            //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet.
            //
            decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal1.Text)) ? "0" : tbAntal1.Text));
            decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris1.Text)) ? "0" : tbStkPris1.Text));
            decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat1.Text)) ? "0" : tbRabat1.Text));
           
            //Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4
            //Og rykker derefter om på karakterene så de står rigtigt.
            if (tbRabat1.Text.StartsWith("0,"))
            {
                stbRabat = tbRabat1.Text.Replace(",", ",00"); //Format: Eks. 0,5
            }
                else if(tbRabat1.Text.Contains(",") && !tbRabat1.Text.StartsWith("0,"))
                {
                    string stbRabat1 = tbRabat1.Text.Replace(",", "");
                    stbRabat = stbRabat1.Replace(stbRabat1,"0,"+stbRabat1); //Format: Eks. 14,7
                }
                    else
                    {
                        stbRabat = "0," + tbRabat1.Text;//Format: Eks. 10
                    }
           
            dtbRabat = decimal.Parse(stbRabat);
            return ((dtbAntal * dtbPrisStk) - (((dtbAntal * dtbPrisStk) * dtbRabat))).ToString("0.00");
        }




Den kode vil jeg gerne genbruge på andre tekstboxe end lige de(n) som denne kode er programmeret til. Er det da muligt at lave en form for løkke som løber det igennem, og det hvor der står f.eks tbStkPris1.Text, så laver det om til tbStkpris2.Text. Osv. med alle de andre tekstboxe. Har nemlig en helt del textboxe og det bliver virkelig meget copy/paste af kode hvis jeg skal skrive denne kode om og om igen i hvert fald 25 gange. Håber det er muligt at kunne lave det! Jeg kan i hvert fald ikke gennemskue hvordan det kan laves.

Jeg har selv tænkt på om man skulle lave noget ala det 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 || !textbox.Name.StartsWith("tbPris")) continue;
                try
                {
                    amount += decimal.Parse(textbox.Text.Trim());
                }
                catch { }
            }
            return amount;
        }

Og så bare med en løkke i stedet for at alle boxene bliver lagt sammen skal den køre koden øverst i denne beskrivelse. Sådan så når knappen bliver trykket kører den den øverste kode for alle textboxe som er indblandet. Håber i forstår. Ellers skriver jeg gerne en bedre forklaring.

Mvh

Martin Sørensen
Avatar billede nielle Nybegynder
20. oktober 2007 - 10:43 #1
Du har fire tekstbokse som høre logisk sammen: tbBeskr1, tbAntal1, tbStkPris1 og dtbRabat. Dertil har du noget kode som høre sammen med disse fire: udregn1().

Alt dette vil du gerne kunne gentage sådan at du kan have flere varelinjer i din form.

Mit råd er at du samler dem som sin egen Windows Control. Hvis du laver det på den måde, vil de fire knapper og deres kode automatisk hænge sammen, uanset hvor mange gange du indsætter dem.

Det gør du ved at oprette et nyt projekt - et Windows Control Library. Du kunne jo f.eks. kalde dette for VareLinjeControl. I dette indsætter du dine textbokse og din kode. Derefter inkluder du dette i dit nuværende projekt, og så kan du begynde at indsætte VareLinjeControl'er en af gangen.

Du kaaaaaaan også lave det på den måde du læger op til i spørgsmplet, men det ovenstående giver en mere ren kode i enden.
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 10:59 #2
Okay. Jeg har noget som hedder user control. Har aldrig arbejdet med det før så er helt grøn!!! Har du evt. en side / link hvor jeg kan læse om det?

Mvh
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 11:05 #3
Kan godt se din idé. Men kan man så ligge textboxene sammen i de forskellige controls? Har nelig en textbox som regner det hele sammen.
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:08 #4
Jeg kan ikke umiddelbart give en god side, men det er nu ikke så svært.

1) Du opretter bare en WC. Den ser næsten ud som om at det vare en ny form du var b´ved at designe.
2) Så trækker du 4 tekstbokse ind på den og omdøber dem til tbBeskr, tbAntal, tbStkPris og dtbRabat (uden 1-tallerne - de bliver overflødige).
3) Så smider du din kode udregn() ind, og modificere den sådan at det kan kompile.
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:09 #5
20/10-2007 11:05:54> Ja, men koden skal selvfølgelig modifiseres en smule. :^)
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 11:12 #6
Ok. Så har jeg nu følgende kode:

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

namespace WindowsApplication1
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        private void UserControl1_Load(object sender, EventArgs e)
        {

        }

        private string udregn1()
        {
            string stbRabat = "";

            // Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0.
            // hvis ja, skriver den en notify da boxen ikke må være tom.
            if (string.IsNullOrEmpty(tbBeskr1.Text) && !string.IsNullOrEmpty(tbAntal1.Text) || !string.IsNullOrEmpty(tbStkPris1.Text))
            {
                NotifyWindow nw = new NotifyWindow("OBS!",
                "Der er ikke skrevet nogen varebeskrivelse i linje 1.");
                nw.Notify();
                tbBeskr1.Focus();// Placere markøren i textboxen.
            }
            else { }
            //
            //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet.
            //
            decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal1.Text)) ? "0" : tbAntal1.Text));
            decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris1.Text)) ? "0" : tbStkPris1.Text));
            decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat1.Text)) ? "0" : tbRabat1.Text));

            //Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4
            //Og rykker derefter om på karakterene så de står rigtigt.
            if (tbRabat1.Text.StartsWith("0,"))
            {
                stbRabat = tbRabat1.Text.Replace(",", ",00"); //Format: Eks. 0,5
            }
            else if (tbRabat1.Text.Contains(",") && !tbRabat1.Text.StartsWith("0,"))
            {
                string stbRabat1 = tbRabat1.Text.Replace(",", "");
                stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7
            }
            else
            {
                stbRabat = "0," + tbRabat1.Text;//Format: Eks. 10
            }

            dtbRabat = decimal.Parse(stbRabat);
            return ((dtbAntal * dtbPrisStk) - (((dtbAntal * dtbPrisStk) * dtbRabat))).ToString("0.00");
        }
    }
}
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:13 #7
I stedet for at din form regner det hele ud inkl. antal og rabat, bør hver VareLinjeControl udregne sin pris, og så bør formen bare lægge priserne for alle VareLinjeControl'erne sammen.
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:14 #8
Omdøb den til noget pænere og mere beskrivende:

F.eks.: UserControl1 => VareLinjeControl
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 11:17 #9
jeps. :) Hvordan mener du så jeg skal indsætte det i min form? skal jeg lave et kald til usercontol eller?
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:19 #10
Først skal det like kunne kompilere. Kan det det?
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 11:20 #11
det kan godt.
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:21 #12
Hvordan ser kode ud nu?
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 11:22 #13
ligesom den ovenover:

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

namespace WindowsApplication1
{
    public partial class VareLinjeControl : UserControl
    {
        public VareLinjeControl()
        {
            InitializeComponent();
        }

        private void UserControl1_Load(object sender, EventArgs e)
        {

        }

        private string udregn1()
        {
            string stbRabat = "";

            // Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0.
            // hvis ja, skriver den en notify da boxen ikke må være tom.
            if (string.IsNullOrEmpty(tbBeskr1.Text) && !string.IsNullOrEmpty(tbAntal1.Text) || !string.IsNullOrEmpty(tbStkPris1.Text))
            {
                NotifyWindow nw = new NotifyWindow("OBS!",
                "Der er ikke skrevet nogen varebeskrivelse i linje 1.");
                nw.Notify();
                tbBeskr1.Focus();// Placere markøren i textboxen.
            }
            else { }
            //
            //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet.
            //
            decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal1.Text)) ? "0" : tbAntal1.Text));
            decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris1.Text)) ? "0" : tbStkPris1.Text));
            decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat1.Text)) ? "0" : tbRabat1.Text));

            //Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4
            //Og rykker derefter om på karakterene så de står rigtigt.
            if (tbRabat1.Text.StartsWith("0,"))
            {
                stbRabat = tbRabat1.Text.Replace(",", ",00"); //Format: Eks. 0,5
            }
            else if (tbRabat1.Text.Contains(",") && !tbRabat1.Text.StartsWith("0,"))
            {
                string stbRabat1 = tbRabat1.Text.Replace(",", "");
                stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7
            }
            else
            {
                stbRabat = "0," + tbRabat1.Text;//Format: Eks. 10
            }

            dtbRabat = decimal.Parse(stbRabat);
            return ((dtbAntal * dtbPrisStk) - (((dtbAntal * dtbPrisStk) * dtbRabat))).ToString("0.00");
        }
    }
}
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:28 #14
Der er lige lidt støj:

UserControl1_Load - bruger stadig det gamle navn.

Der står tbBeskr1 og tbAntal1 og tbStkPris1 og tbRabat1. Dette bør rettes til tbBeskr og tbAntal og tbStkPris og tbRabat. I din VareLinjeKOntrol slaæ der jo kun være et sæt af knapper og derfor er det ikke nødvendigt at nummerere dem.

Din udregn1() bør på samme måde bare hedde udregn().
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 11:38 #15
Sådan :D

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

namespace WindowsApplication1
{
    public partial class VareLinjeControl : UserControl
    {
        public VareLinjeControl()
        {
            InitializeComponent();
        }

        private string udregn()
        {
            string stbRabat = "";

            // Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0.
            // hvis ja, skriver den en notify da boxen ikke må være tom.
            if (string.IsNullOrEmpty(tbBeskr.Text) && !string.IsNullOrEmpty(tbAntal.Text) || !string.IsNullOrEmpty(tbStkPris.Text))
            {
                NotifyWindow nw = new NotifyWindow("OBS!",
                "Der er ikke skrevet nogen varebeskrivelse i linje 1.");
                nw.Notify();
                tbBeskr.Focus();// Placere markøren i textboxen.
            }
            else { }
            //
            //Tjekker om tbAntal1.Text || tbStkPris1.Text || tbRabat1.Text er null eller 0, hvis ja, skrives der 0 i feltet.
            //
            decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal.Text)) ? "0" : tbAntal.Text));
            decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris.Text)) ? "0" : tbStkPris.Text));
            decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat.Text)) ? "0" : tbRabat.Text));

            //Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4
            //Og rykker derefter om på karakterene så de står rigtigt.
            if (tbRabat.Text.StartsWith("0,"))
            {
                stbRabat = tbRabat.Text.Replace(",", ",00"); //Format: Eks. 0,5
            }
            else if (tbRabat.Text.Contains(",") && !tbRabat.Text.StartsWith("0,"))
            {
                string stbRabat1 = tbRabat.Text.Replace(",", "");
                stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7
            }
            else
            {
                stbRabat = "0," + tbRabat.Text;//Format: Eks. 10
            }

            dtbRabat = decimal.Parse(stbRabat);
            return ((dtbAntal * dtbPrisStk) - (((dtbAntal * dtbPrisStk) * dtbRabat))).ToString("0.00");
        }

    }
}
Avatar billede nielle Nybegynder
20. oktober 2007 - 11:43 #16
Jeg kan se at der er lidt som har overlevet i kommentarerne, men pyt med det. ;^)

Inden at vi går vidre skal du lige have sikret dig at du har placeret knapperne rigtig på "formen" og at du har trukket i højde og bredde på controllen sådan at den ikke selv fylder for meget.
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 11:45 #17
Er gjort :D
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 12:01 #18
hvordan tilføjer jeg så controlen til min Form?
Avatar billede nielle Nybegynder
20. oktober 2007 - 12:15 #19
Pinligt, jeg havde lige glemt hvordan man gør. Så skulle først i bøgerne...

Gå ind på dit oprindelige projekt. Du har formentlig Toolbox'en åben i venstre side. Du tilføjer nu din nye kontrol sådan her:

Højreklik på din Toolbox
Vælg menupunktet Choose items...
Vælg tab'en .NET Framework Components
Tryk på knappen Browse...
Find frem til din DLL for VareLinjeControl, og dobbeltklik

Den skulle gerne dukke op under General, og du trækker den ind på din form lige som du plejer.
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 12:25 #20
Det er hermed gjort. :)
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 12:28 #21
Nu ligger den i min form
Avatar billede nielle Nybegynder
20. oktober 2007 - 12:28 #22
Ok, nu kan du så trække din nye flotte kontrol ind på formen, og du kan trække lige så mange ind som du ønsker.

Hvad så nu?
Avatar billede nielle Nybegynder
20. oktober 2007 - 12:29 #23
Faktisk skal den jo erstattte (næsten) alle de gamle textboxe du har, så det næste er vel at slette dem og se hvad der så sker?
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 12:30 #24
Ja, så skal jeg have den til at regne. ved at trykke på en knap! Men jeg forstår ikke helt hvordan man kalder controlen
Avatar billede nielle Nybegynder
20. oktober 2007 - 12:31 #25
Skal der være sådan en knap pr. varelinje? For så burde den vel være en del af controllen?
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 12:34 #26
Nej, der skal være en knap til sidst som kalder udregn().

Så skal alle linjerne regne. Ligenu kan den godt ligge totalen sammen. Men den gider ikke regne.
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 12:41 #27
altså i formen. Så når jeg trykker på den så regner den alle controllerne. hvis du forstår`?
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 12:59 #28
Kan jeg ikke kalde fra en knap i formen´, en metode i VareLinjeControl?

Jeg har prøvet:

VareLinjeControl vl = new VareLinjeControl();
vl.udregnPris();

Men så sker der bare ikke noget.

Og udregnPris i VareLinjeControl ser således ud:

        public void udregnPris()
        {
            tbPris.Text = udregn();
        }


Og Udregn i VareLinjeControl ser således ud:

private string udregn()
        {
            string stbRabat = "";

            // Tjekker om tbBeskr.Text er null eller 0, og om tbStkPris.Text eller tbAntal.Text er null eller 0.
            // hvis ja, skriver den en notify da boxen ikke må være tom.
            if (string.IsNullOrEmpty(tbBeskr.Text) && !string.IsNullOrEmpty(tbAntal.Text) || !string.IsNullOrEmpty(tbStkPris.Text))
            {
                NotifyWindow nw = new NotifyWindow("OBS!",
                "Der er ikke skrevet nogen varebeskrivelse i linje 1.");
                nw.Notify();
                tbBeskr.Focus();// Placere markøren i textboxen.
            }
            else { }
            //
            //Tjekker om tbAntal.Text || tbStkPris.Text || tbRabat.Text er null eller 0, hvis ja, skrives der 0 i feltet.
            //
            decimal dtbAntal = decimal.Parse(((string.IsNullOrEmpty(tbAntal.Text)) ? "0" : tbAntal.Text));
            decimal dtbPrisStk = decimal.Parse(((string.IsNullOrEmpty(tbStkPris.Text)) ? "0" : tbStkPris.Text));
            decimal dtbRabat = decimal.Parse(((string.IsNullOrEmpty(tbRabat.Text)) ? "0" : tbRabat.Text));

            //Tjekker tbRabat i hvilken form rabatten er skrevet. 0,5 || 10|| 13,4
            //Og rykker derefter om på karakterene så de står rigtigt.
            if (tbRabat.Text.StartsWith("0,"))
            {
                stbRabat = tbRabat.Text.Replace(",", ",00"); //Format: Eks. 0,5
            }
            else if (tbRabat.Text.Contains(",") && !tbRabat.Text.StartsWith("0,"))
            {
                string stbRabat1 = tbRabat.Text.Replace(",", "");
                stbRabat = stbRabat1.Replace(stbRabat1, "0," + stbRabat1); //Format: Eks. 14,7
            }
            else
            {
                stbRabat = "0," + tbRabat.Text;//Format: Eks. 10
            }

            dtbRabat = decimal.Parse(stbRabat);
            return ((dtbAntal * dtbPrisStk) - (((dtbAntal * dtbPrisStk) * dtbRabat))).ToString("0.00");
        }
Avatar billede nielle Nybegynder
20. oktober 2007 - 13:08 #29
Du skal rette i din VareLinjeControl sådan at beregn kan ses udefra:

private string udregn()

ændres til:

public string udregn()

Derefter er det noget i denne stil fra din form:

        private void button1_Click(object sender, EventArgs e)
        {
            string beregnet = this.vareLinjeControl1.beregn();
        }
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 13:21 #30
private void button1_Click(object sender, EventArgs e)
{
this.vareLinjeControl1.tbPris.Text = this.vareLinjeControl1.udregn();
}


Så virker det. :D
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 13:22 #31
men er det muligt at lave det så man bare med en metode kan kalde alle varelinjecontrol1,2,3,4,5,6.... osv?

Noget lign det her?

private void button1_Click(object sender, EventArgs e)
{
this.vareLinjeControl.tbPris.Text = this.vareLinjeControl.udregn();
}

Så den virker på alle varelinjecontrol?
Avatar billede nielle Nybegynder
20. oktober 2007 - 13:40 #32
Er tbPris et nyt felt i din kontrol?

Du kan faktisk ændre din beregn metode en smule:

        public void udregn()
        {
            string stbRabat = "";

            ...

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

Så ville koden se sådan her ud i stedet:

private void button1_Click(object sender, EventArgs e)
{
    this.vareLinjeControl.udregn();
}
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 14:08 #33
Det virker. Men jeg skal tadig skrive:

private void button1_Click(object sender, EventArgs e)
{
    this.vareLinjeControl1.udregn();
    this.vareLinjeControl2.udregn();
    this.vareLinjeControl3.udregn();
    ...
}

Er der en måde det kan løses nemmere på?

Mvh
Avatar billede nielle Nybegynder
20. oktober 2007 - 14:25 #34
Samme metide som du har brugt før:

private void opdaterAlleVareLinjeControl(Control control)
{
    foreach (Control childControl in control.Control)
    {
        VareLinjeControl vlc = childControl as VareLinjeControl;

        if (vlc != null)
            vlc.udregn();
        else
            opdaterAlleVareLinjeControl(childControl);
    }
}
Avatar billede martinsorensen Nybegynder
20. oktober 2007 - 14:51 #35
Intet mindre end fantastisk!!!

Smid et svar.

Jeg siger 1000000 TAK!!! du har virkelig været til KÆMPE hjælp! Virkelig mange tak for tålmodigheden!

Lige en lille ting. Der skal et "s" på:

    foreach (Control childControl in control.Control"s")

mvh

Martin Sørensen
Avatar billede nielle Nybegynder
20. oktober 2007 - 14:55 #36
Du har ret :^)
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