Avatar billede cogitans Nybegynder
24. marts 2005 - 19:36 Der er 17 kommentarer og
1 løsning

Sessionsspørgsmål + at sætte en side sammen, så den fungerer

Er der 1 asp.Net-haj, som lige vil kaste et blik på min kode (1-2 sider), rette de få fejl der er, og så sende koden tilbage til mig?

(jeg har brugt 1 måned på denne simple side nu, og nu vil jeg gerne have noget seriøs hjælp...)
Avatar billede burningice Nybegynder
24. marts 2005 - 19:41 #1
hvor mange linjer kode snakker vi om? og er det kun koden, eller er der også aspx-sider der skal kigges igennem?
Avatar billede cogitans Nybegynder
24. marts 2005 - 19:52 #2
Der er ca. 90 meget korte linier c#-kode. Så er der aspx-siden, som også gerne må checkes. Der er vel ca. det samme.
Men for begge dokumenter gælder det, at der ikke står særlig meget på hver linie, samt at dokumenterne er bygget kronologisk op. Hvis en venlig sjæl siger "god" for lige at se på koden, så får vedkommende selvfølgelig lige en forklaring med.
Avatar billede burningice Nybegynder
24. marts 2005 - 19:59 #3
du er velkommen at sende til eksperten@burningice.dk, så skal jeg nok kigge det igennem :)
Avatar billede cogitans Nybegynder
24. marts 2005 - 20:00 #4
Fino - der skal så også lige siges, at jeg har fået en masse af koden til at virke. Så det er vel kun 1/3 af koden, der er problemer med.
Avatar billede burningice Nybegynder
24. marts 2005 - 20:09 #5
hvad er dit sessions-spørgsmål?
Avatar billede cogitans Nybegynder
24. marts 2005 - 20:16 #6
Det er, hvordan man får koden til at fungere vha. sessions.
Avatar billede burningice Nybegynder
24. marts 2005 - 21:47 #7
:)

http://burningice.dk/eksperten.dk/603292/Default.aspx

sådan, så virker det vist. Jeg har simplificeret din kode en del, og lavet typestærk adgang til session-objecter samt brugt CommandArgument på knapperne til dine if-statements. Og ikke mindst har jeg enablet ViewState. Ved ikke om du med vilje havde slået det fra, men uden viewstate kommer man ikke langt.
Avatar billede burningice Nybegynder
24. marts 2005 - 21:59 #8
jeg paster lige det vigtigste af det jeg har ændret, så der ikke er nogen der undrer sig over hvad det er der foregår

private DateTime StartTime
        {
            get { return (DateTime)Session["starttid"]; }
            set { Session["starttid"] = value; }
        }

        private TimeSpan TimeElapsed
        {
            get
            {    if (Session["elapsedTime"] == null) return DateTime.Now.Subtract(StartTime);
                return (TimeSpan)Session["elapsedTime"];
            }

            set { Session["elapsedTime"] = value; }
        }

        private DateTime LastUpdate
        {
            get
            {
                if (Session["lastUpdate"] == null) return DateTime.Now;
                return (DateTime)Session["lastUpdate"];
            }
            set { Session["lastUpdate"] = value; }
        }

        private DateTime EndTime
        {
            get { return (DateTime)Session["sluttid"]; }
            set { Session["sluttid"] = value; }
        }

        private void Page_Load(object sender, System.EventArgs e)
        {
            if (!this.IsPostBack)
            {
                startKnap.CommandArgument = "start";
            }
        }

private void startKnap_Click(object sender, System.EventArgs e)
        {
            // Hvis det er der er trykket start
            if(startKnap.CommandArgument == "start")
            {
                lbStarttid.Text = "";
                lbSluttid.Text = "";
                lbBrugtTid.Text = "";
                lbBrugtSpec.Text = "";
                StartTime = DateTime.Now;
                LastUpdate = StartTime;
                TimeElapsed = new TimeSpan(0, 0, 0, 0, 0);
               
                lbStarttid.Text = StartTime.ToLongTimeString();
                startKnap.Text = "Slut ur";
                startKnap.CommandArgument = "stop";
                pauseKnap.Visible = true;
                pauseKnap.CommandArgument = "pause";

                return;
            }

            // Hvis der er trykket stop
            if (startKnap.CommandArgument == "stop")
            {
                TimeElapsed = TimeElapsed.Add(DateTime.Now.Subtract(LastUpdate));
                EndTime = DateTime.Now;

                lbSluttid.Text = EndTime.ToLongTimeString();

                lbBrugtTid.Text = String.Format("{0}:{1}:{2}",
                                                TimeElapsed.Hours,
                                                TimeElapsed.Minutes,
                                                TimeElapsed.Seconds);

                lbBrugtSpec.Text = String.Format("Timer: {0} Minutter: {1} Sekunder:{2}",
                                                TimeElapsed.Hours,
                                                TimeElapsed.Minutes,
                                                TimeElapsed.Seconds);

                startKnap.Text = "Start ur";
                startKnap.CommandArgument = "start";
                pauseKnap.Visible = false;

                //andre sessions end "igang" nullsættes.
                resetSessions();

                return;
            }
        }

        private void resetSessions()
        {
            Session.Clear();
        }

        private void pauseKnap_Click(object sender, System.EventArgs e)
        {
            if (pauseKnap.CommandArgument == "pause")
            {
                TimeElapsed = DateTime.Now.Subtract(LastUpdate);

                startKnap.Visible = false;
                pauseKnap.Text = "Ophæv pause";
                pauseKnap.CommandArgument = "resume";
            }

            else if(pauseKnap.CommandArgument == "resume")
            {
                LastUpdate = DateTime.Now;
               
                startKnap.Visible = true;
                pauseKnap.Text = "Pause";
            }
        }


Og så selvfølgelig skal EnableViewState sættes til true på din aspx-side.

Jeg har sendt dig en rar-fil med de to filer i.
Avatar billede cogitans Nybegynder
24. marts 2005 - 22:05 #9
Tak for det :-)

Lægger du så også lige et svar?
Avatar billede burningice Nybegynder
24. marts 2005 - 22:10 #10
svar :)

jeg håber du kan se hele idéen i den nye struktur jeg fik strukket sammen. Istedet for at tage højde for evt. pauser når at det samlede tidsforbrug skal regnes ud, sørger jeg for hele tiden at holde styr på hvor lang tid der er brugt hver gang der laves et postback. Det gør også at der kan holdes uendelig mange pauser uden at det vil give problemer:

Scenario 1:

Start: 21:00  (tid brugt: 0 minutter)
Stop: 21:10    (tid brugt: 10 minutter)

Scenario 2:

Start: 21:00  (tid brugt: 0 minutter)
Pause: 21:34  (tid brugt: 34 minutter)
Pause slut: 21:45 (tid brugt: 34 minutter)
Pause: 22:00  (tid brugt: 49 minutter)
Pause slut: 22:15 (tid brugt: 49 minutter)
Slut: 22:25    (tid brugt: 59 minutter)
Avatar billede burningice Nybegynder
24. marts 2005 - 22:10 #11
.
Avatar billede cogitans Nybegynder
24. marts 2005 - 22:14 #12
Ja, det kan jeg godt se. Jeg kan dog ikke lige se, hvorfor du har valgt det. Jeg mener: det er jo bare en anden måde at regne tiden ud på, fremfor at regne den samlede tid ud, og trække den samlede pause fra bagefter?
Avatar billede burningice Nybegynder
24. marts 2005 - 22:22 #13
sådan som jeg så din kode, så lagde du tiden man havde holdt pause sammen, og trak den fra den samlede tid der var brugt. Med mindre du skal bruge den tid til noget, så synes jeg bare det giver for mange tider at holde styr på. Men det er måske bare et spørgsmål om smag og behag.

En ting du dog skal have styr på, det er at få lavet typestærk tilgang til alle dine ting.
Avatar billede burningice Nybegynder
24. marts 2005 - 22:36 #14
hvis du gerne vil have det den anden vej rundt kan det gøres sådan her:

private DateTime StartTime
        {
            get { return (DateTime)Session["starttid"]; }
            set { Session["starttid"] = value; }
        }

        private TimeSpan TimeElapsed
        {
            get { return (TimeSpan)Session["elapsedTime"]; }
            set { Session["elapsedTime"] = value; }
        }

        private TimeSpan TotalPauseTime
        {
            get
            {
                if (Session["timeUsedOnPause"] == null) return new TimeSpan(0, 0, 0, 0, 0);
                return (TimeSpan)Session["timeUsedOnPause"];
            }

            set { Session["timeUsedOnPause"] = value; }
        }

        private DateTime PauseStartTime
        {
            get { return (DateTime)Session["auseStartTime"]; }
            set { Session["auseStartTime"] = value; }
        }

        private DateTime EndTime
        {
            get { return (DateTime)Session["sluttid"]; }
            set { Session["sluttid"] = value; }
        }

private void startKnap_Click(object sender, System.EventArgs e)
        {
            // Hvis det er der er trykket start
            if(startKnap.CommandArgument == "start")
            {
                lbStarttid.Text = "";
                lbSluttid.Text = "";
                lbBrugtTid.Text = "";
                lbBrugtSpec.Text = "";
                StartTime = DateTime.Now;
               
                lbStarttid.Text = StartTime.ToLongTimeString();
                startKnap.Text = "Slut ur";
                startKnap.CommandArgument = "stop";
                pauseKnap.Visible = true;
                pauseKnap.CommandArgument = "pause";

                return;
            }

            // Hvis der er trykket stop
            if (startKnap.CommandArgument == "stop")
            {
                EndTime = DateTime.Now;
                TimeElapsed = EndTime.Subtract(StartTime).Subtract(TotalPauseTime);

                lbSluttid.Text = EndTime.ToLongTimeString();

                lbBrugtTid.Text = String.Format("{0}:{1}:{2}",
                                                TimeElapsed.Hours,
                                                TimeElapsed.Minutes,
                                                TimeElapsed.Seconds);

                lbBrugtSpec.Text = String.Format("Timer: {0} Minutter: {1} Sekunder:{2}",
                                                TimeElapsed.Hours,
                                                TimeElapsed.Minutes,
                                                TimeElapsed.Seconds);

                startKnap.Text = "Start ur";
                startKnap.CommandArgument = "start";
                pauseKnap.Visible = false;

                //andre sessions end "igang" nullsættes.
                resetSessions();

                return;
            }
        }

        private void resetSessions()
        {
            Session.Clear();
        }

        private void pauseKnap_Click(object sender, System.EventArgs e)
        {
            if (pauseKnap.CommandArgument == "pause")
            {
                PauseStartTime = DateTime.Now;

                startKnap.Visible = false;
                pauseKnap.Text = "Ophæv pause";
                pauseKnap.CommandArgument = "resume";
            }

            else if(pauseKnap.CommandArgument == "resume")
            {
                TimeSpan timeUsedOnThisPause = DateTime.Now.Subtract(PauseStartTime);
                TotalPauseTime = TotalPauseTime.Add(timeUsedOnThisPause);

                startKnap.Visible = true;
                pauseKnap.Text = "Pause";
            }
        }
Avatar billede cogitans Nybegynder
27. marts 2005 - 15:39 #15
Jeg har set på koden nu, og finder den passende ;-)
Jeg har dog 2 spørgsmål:
-er alle de set/get'er lavet, for at gøre koden mere overskuelig/lettilgængelig eller er de blot lavet, fordi c# understøtter det eller hvordan?
-og hvad menes der helt nøjagtig i 24/03-2005 22:22:13: "En ting du dog skal have styr på, det er at få lavet typestærk tilgang til alle dine ting"? Er det blot at typecaste, der menes her?
Avatar billede burningice Nybegynder
27. marts 2005 - 17:30 #16
jeg har lavet get-set metoderne for at lave en typestærk tilgang til dine session-data. Dvs. at alle de steder du har brug for at hente eller gemme i sessionen kan du bruge de properties. Dvs. at du aldrig vil komme ud for at koden forventer en forkert type (det vil give compilerfejl), eller du kommer til at skrive key'en forkert.
Avatar billede cogitans Nybegynder
27. marts 2005 - 18:00 #17
Ah, på dén måde. For at gøre det hele lidt lettere, så en generel metode hver gang klarer hent/sæt af variabler.
Jeg undrer mig bare over selve ordet "typestærk". Det har så ikke noget at gøre med typecasting, men derimod at sikre et bestemt output eller en bestemt måde for at gemme input.
Avatar billede burningice Nybegynder
27. marts 2005 - 23:03 #18
ja... at noget er typestærk er at man altid på et givent tidspunkt ved hvilken type et object er. Og det er ikke nok at programmøren ved det, compileren skal også vide det.

Det kan godt være træls nogen gange, men det gør altså at man i længden får mindre underlige fejl under runtime. Vb.net er f.eks. ikke lige så typestærk som c#, da man her godt kan få lov at lave nogle rimelige obskure ting der kan se helt forkerte ud for en udefra kommende. Nå, jeg må nok hellere stoppe før jeg træder alt for meget rundt i denne "holy grail".
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
Kurser inden for grundlæggende programmering

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