Avatar billede ihtezaz Praktikant
09. november 2005 - 13:29 Der er 55 kommentarer og
1 løsning

countdown ur på nettet der laver event når target time er nået ?

Hej

Er der nogen der kender et nedtællingsur der laver event når den er nået nul.

På forhånd tak.
Avatar billede snepnet Nybegynder
09. november 2005 - 13:31 #1
skal uret køre clientside eller serverside?
mvh
Avatar billede snepnet Nybegynder
09. november 2005 - 13:32 #2
hvis det er serverside kan du bare bruge System.Timers.Timer
mvh
Avatar billede snepnet Nybegynder
09. november 2005 - 13:35 #3
clientside kan du sådan bare gøre det med metatags:
sådan noget i denne stil:
<META HTTP-EQUIV="refresh" content="10;URL=http://din.url.aspx">
så havner du i hvert fald i din serverkode igen... ved ikke om det er tilstrækkeligt.
mvh
Avatar billede snepnet Nybegynder
09. november 2005 - 13:51 #4
... er det fordi du gerne vil have det som en rigtig kontrol der kan bruges på en side på samme måde som f.eks. en knap?
mvh
Avatar billede ihtezaz Praktikant
09. november 2005 - 14:06 #5
Hej snepnet

Uret skal bruges til et auktion, så den skal tage tiden serverside. Hvad vil du forslå jeg brugte ?
Avatar billede snepnet Nybegynder
09. november 2005 - 14:20 #6
du kan bruge den her:

System.Timers.Timer

den er rimelig enkel at bruge :

using System.Timers;

Timer timer = new Timer();
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
timer.Interval = 5000; // 5 sekunder
timer.Start();

// og en handler af elapsedeventet
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
  // ...
}

du skal jo nok hygge dig lidt med at lægge dine timers i session - eller måske en static list af en art.

men... mht til eventet... hvordan præcis havde du forestillet dig det skulle fungere?
(der er forskellige løsninger)

mvh
Avatar billede ihtezaz Praktikant
09. november 2005 - 14:32 #7
det lyder fremragne snepnet, den måde jeg havde tænkt mig det skulle fungere er, at en auktionen bliver startet på et given dato f.eks. 9-11-2005 og skal slutte 10-9-2005. uret viser således
dage timer min sek
0    23  52  40

Når uret når nul, laves et event, hvor jeg håndtere,  sådan noget med at sende mails til vinderen..osv. så timerElapsed eventet kan jeg sagtens bruge. 

mht. sessions, jeg bliver vel nødt til at tage alle mine timers i session objekter når brugeren surfer auktionen.
Avatar billede snepnet Nybegynder
09. november 2005 - 14:37 #8
mmmmm.... hæng lige på - så sender jeg dig et lille eksempel.
mvh
Avatar billede ihtezaz Praktikant
09. november 2005 - 14:39 #9
takker den god snepnet
Avatar billede snepnet Nybegynder
09. november 2005 - 15:18 #10
sorry ... der er lige kommet noget op - det går går nok lige en times tid ell.
mvh
Avatar billede ihtezaz Praktikant
09. november 2005 - 15:32 #11
Helt iorden, du skriver bare når du kan.
Avatar billede snepnet Nybegynder
10. november 2005 - 13:45 #12
Det blev faktisk så sent at eksperten var lukket :o)

Du kan lige får nogle snippets her - det er bare pladderkode, men jeg håber det illustrerer nogle principper du kan gå videre med.

Du kan også godt få events mv. når tiden løber ud.

Der er en timer i auktionsklassen der sådan set sagtens kan undværes, men jeg har lagt den ind for eksemplets skyld, og fordi der sikkert alligevel skal ske et eller andet når en auktion timer ud.

Håber du kan bruge nogle af klodserne til et eller andet.

mvh

// først en side hvor du kan oprette en auktion
// desiden kan siden hente lidt oplysninger fra en handler vha. javascript
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <script language="javascript" type="text/javascript">
    function updateTime()
    {
        var targetUrl = "Handler.ashx";
        var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
       
        xmlHttp.open( "POST", targetUrl, false);
        xmlHttp.send();       
       
        var res = xmlHttp.responseText;   
        var times = xmlHttp.responseText.split('|');
       
        for(i=0;i<auctionFields.length;i++)
        {
            window.status = "[" + auctionFields[i] + "|" + times[i] + "]";
            document.getElementById(auctionFields[i]).innerText = times[i];   
        }
             
        setTimeout("updateTime()", 1000);                       
    }
    </script>
</head>
<body id="body" runat="server">
    <form id="form1" runat="server">
    <div>
        <table border="0">
            <tr>
                <td style="width: 100px">
                    Navn</td>
                <td style="width: 100px">
                    Afsluttes</td>
                <td style="width: 100px">
                    Opret</td>
            </tr>
            <tr>
                <td style="width: 100px"><asp:TextBox ID="txtAuctionName" runat="server"></asp:TextBox></td>
                <td style="width: 100px"><asp:TextBox ID="txtEndtime" runat="server"></asp:TextBox></td>
                <td style="width: 100px"><asp:Button ID="btnCreateAuction" runat="server" Text="Opret auktion" OnClick="btnCreateAuction_Click" /></td>
            </tr>
        </table>
    </div>
    </form>
</body>
</html>

// her noget kode til siden
protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        ShowAuctions();
}

protected void btnCreateAuction_Click(object sender, EventArgs e)
{
    // bare lige så man slipper for at taste et tidspunkt ind
    DateTime endTime = DateTime.Now.AddMinutes(DateTime.Now.Minute);
    try
    {
        endTime = DateTime.Parse(txtEndtime.Text);
    }
    catch { }
   
    AuctionServer.CreateAuction(txtAuctionName.Text, endTime);
    ShowAuctions();
}

private void ShowAuctions()
{
    StringBuilder array = new StringBuilder();

    Table tbl = new Table();
    tbl.GridLines = GridLines.Both;
    form1.Controls.Add(tbl);
    TableRow tr = null;
    TableCell tc = null;
    int count = 0;
    foreach (Auction auction in AuctionServer.Auctions)
    {
        tr = new TableRow();
        tc = new TableCell();
        tc.Text = auction.Name;
        tr.Cells.Add(tc);
        tbl.Rows.Add(tr);
       
        tc = new TableCell();
        tc.ID = "timeLabel_" + count.ToString();           
        tc.Text = String.Format("{0}:{1}:{2}", auction.TimeLeft.Hours, auction.TimeLeft.Minutes, auction.TimeLeft.Seconds);
        tr.Cells.Add(tc);
        tbl.Rows.Add(tr);

        array.Append("'");
        array.Append(tc.ClientID);
        array.Append("'");
        if (AuctionServer.Auctions.IndexOf(auction) < AuctionServer.Auctions.Count-1)
        {
            array.Append(",");
        }
        count++;
    }
           
    ClientScript.RegisterArrayDeclaration("auctionFields", array.ToString());
    if (AuctionServer.Auctions.Count > 0)
    {
        body.Attributes.Add("onload", "updateTime();");
    }
}

// et par klasser til at simulere auktioner
// auktionsserver
public class AuctionServer
{
    private static ArrayList _auctions;

    public static ArrayList Auctions
    {
        get { return AuctionServer._auctions; }
    }

    static AuctionServer()
    {
        _auctions = new ArrayList();
    }

    public static Auction CreateAuction(string name, DateTime endTime)
    {
        Auction auction = new Auction(name, endTime);
        _auctions.Add(auction);
        return auction;
    }
}

// en auction
public class Auction
{
    private string _name;
    private bool _hasEnded;
    private Timer timer;
    private DateTime _startTime;
    private DateTime _endTime;

    public TimeSpan TimeLeft
    {
        get { return _endTime - DateTime.Now; }
    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    public bool HasEnded
    {
        get { return _hasEnded; }
    }

    public DateTime EndTime
    {
        get { return _endTime; }
        set { _endTime = value; }
    }

    public DateTime StartTime
    {
        get { return _startTime; }
        set { _startTime = value; }
    }

    public Auction(string name, DateTime endTime)
    {
        _name = name;
        _startTime = DateTime.Now;
        _endTime = endTime;
        timer = new Timer();
        timer.Interval = 1000;
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        timer.Start();
    }

    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (DateTime.Now >= _endTime)
        {
            _hasEnded = true;
            timer.Stop();
            timer.Dispose();
        }
    }
}

// og til sidste en handler der kan returnere den resterende tid clientside
public class Handler : IHttpHandler
{         
    public void ProcessRequest (HttpContext context)
    {
        StringBuilder response = new StringBuilder();
        foreach (Auction auction in AuctionServer.Auctions)
        {
            response.Append(String.Format("{0}:{1}:{2}:{3}", auction.TimeLeft.Days, auction.TimeLeft.Hours, auction.TimeLeft.Minutes, auction.TimeLeft.Seconds));
            if (AuctionServer.Auctions.IndexOf(auction) < AuctionServer.Auctions.Count-1)
            {
                response.Append("|");
            }           
        }
        context.Response.Write(response.ToString());
    }
   
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}
Avatar billede ihtezaz Praktikant
13. november 2005 - 19:21 #13
Tak snepnet, jeg er ved at tjekke det ud, skriver lige når der er spørgsmål til det.
Avatar billede snepnet Nybegynder
13. november 2005 - 19:24 #14
var så lidt :o) - du spørger bare.
mvh
Avatar billede ihtezaz Praktikant
13. november 2005 - 23:57 #15
Hej igen snepnet, ClientScript.RegisterArrayDeclaration, findes denne klasse kun i asp.net 2.0, for jeg synes ikke at kun finde det.
Avatar billede ihtezaz Praktikant
14. november 2005 - 00:03 #16
her bruger du body, hvilken control kalder du det?   
if (AuctionServer.Auctions.Count > 0)
    {
        body.Attributes.Add("onload", "updateTime();");
    }
Avatar billede snepnet Nybegynder
14. november 2005 - 09:19 #17
hej igen :o)

body-kontrollen laver du med en :
proteced HtmlGenericControl body;

mht. til det med RegisterArrayDeclaration, så findes den også i 1.1 men ligger ikke under ClientScript - blot direkte under Page, såhh....
this.RegisterArrayDeclaration(...) skulle funge.

mvh
Avatar billede ihtezaz Praktikant
14. november 2005 - 09:47 #18
Oki doki..

så var der Handler klassen, det er en ganske almindelig cs klasse, hvorfor angives den som Handler.ashx, som nedenfor ?

function updateTime()
    {
        var targetUrl = "Handler.ashx";
        var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");


På forhånd tak, snepnet.
Avatar billede snepnet Nybegynder
14. november 2005 - 10:09 #19
mmm... det kunne sådan set også bare havet været en helt almindelig aspx-form, men der er mindre overhead med ashx-filer.
mvh
Avatar billede ihtezaz Praktikant
14. november 2005 - 23:02 #20
Hej igen Snepnet

Hvordan får du fat i form1:

  Table tbl = new Table();
    tbl.GridLines = GridLines.Both;
    form1.Controls.Add(tbl);
Avatar billede ihtezaz Praktikant
14. november 2005 - 23:27 #21
Jeg får den resterende tid vist, men den tæller ikke ned, jeg tror det handler, som jeg har fejl i.
Avatar billede snepnet Nybegynder
15. november 2005 - 07:06 #22
jeg får fat i den ved at have en
protected HtmlForm form1;

mht. eventuelle fejl - så må du lige debugge og se hvor det går galt.
mvh
Avatar billede ihtezaz Praktikant
15. november 2005 - 18:28 #23
Snepnet den ashx filen, laver du først en cs fil og omdøber den til ashx bagefter ?
Avatar billede ihtezaz Praktikant
15. november 2005 - 18:31 #24
Jeg bruger this.Controls.Add() istedetfor form1, således kan jeg få vist tabellen, jeg kan ikke få den vist ved at bruge Htmlform objekt.
Avatar billede ihtezaz Praktikant
15. november 2005 - 20:08 #25
Jeg har fundet fejlen, min updateTime script køre ikke. Ved ikke helt hvorfor, jeg nemlig ikke ret god til scriptning.

det er den måde jeg addere updateTime, ligesom du gav eksempel på.

HtmlGenericControl body;

inde i ShowAuctions metoden: body new = HtmlGenericControl("<body>");
                              body.Attributes.Add("onload", "updateTime();");

Ved ikke helt hvor fejlen er sket, men min updateTime() bliver ikke kørt, jeg tjekker med  window.alert("test"); inde i min updateTime(), og den bliver ikke vist.
Avatar billede ihtezaz Praktikant
15. november 2005 - 21:30 #26
så er der gang i uret. tak for det snepnet, jeg skal bare lige teste, hvad der sker når uret timer out og så vanker der points.
Avatar billede snepnet Nybegynder
16. november 2005 - 18:26 #27
sorry - har ikke været hjemme, men jeg kan forstå du fandt ud af det :o)
vi skrives ved :o)
mvh
Avatar billede ihtezaz Praktikant
23. november 2005 - 00:01 #28
Det ser meget lovende ud snepnet den god. Bare smid et svar, hvis der er andre spørgsmål kan jeg jo altid skriv. :)
Avatar billede snepnet Nybegynder
23. november 2005 - 00:48 #29
jeps - du skriver bare :o)
mvh
Avatar billede ihtezaz Praktikant
24. november 2005 - 21:32 #30
Hej igen den god snepnet

Jeg ved ikke hvorfor jeg explicit skal i min aspx indsætte updateTime() metoden i min body tag, for gøre jeg det på den angivne måde :
body new = HtmlGenericControl("<body>");
                            body.Attributes.Add("onload", "updateTime();");

i min code behind side, for jeg parser fejl, at  "auctionFields" ikke er erklæret.
ved ikke helt hvad det skyldes.
Avatar billede snepnet Nybegynder
24. november 2005 - 21:41 #31
du skal ikke lave en new på din body .... bare indsæt en deklaration i toppen af klassen:

protected HtmlGenericControl body;

så kan du bruge den kode jeg sendte dig.

grunden til at jeg indsætter den programmatisk er, at det ikke er sikkert den skal ind.

mvh
Avatar billede ihtezaz Praktikant
24. november 2005 - 21:49 #32
oki doki..så var det sikkert det. takker.
Avatar billede ihtezaz Praktikant
24. november 2005 - 22:52 #33
Jeg får objektref ikke indstillet til et objekt, hvis jeg kun erklære den og ikke new'er den.
Avatar billede snepnet Nybegynder
24. november 2005 - 22:54 #34
har du id="body" og runat="server" på dit body-tag i html'en?
mvh
Avatar billede ihtezaz Praktikant
24. november 2005 - 23:03 #35
:) selfølgelig var dette fejlen, det havde jeg ikke. endnu engang tak snepnet
Avatar billede snepnet Nybegynder
24. november 2005 - 23:04 #36
var så lidt :o)
mvh
Avatar billede ihtezaz Praktikant
29. november 2005 - 00:01 #37
hej snepnet,
jeg bliver desværre nødt til at forstyrre dig en sidste gang på denne spørgsmål.
Det hele fungere rigtig godt, der bliver også lavet event når tiden udløber, men selv der bliver køret timer.stop() og timer.dispose() i elapsed eventet, så køre tiden videre til minus istedet for at stoppe ved 0.0.0.0 det som, om tråden bliver ved med at køre. Hvordan kan dette løses den gode snepnet.
Avatar billede snepnet Nybegynder
29. november 2005 - 01:50 #38
mmm... hvis det stadig er koden herfra du bruger skal du nok kigge lidt på den der TimeLeft property på Auction-klassen - den er vist lige fesen nok...

prøv sådan her:

public TimeSpan TimeLeft
{
    get
    {
        if (_hasEnded)
            return TimeSpan.Zero;
        else
            return _endTime - DateTime.Now;
    }
}

mvh
Avatar billede ihtezaz Praktikant
30. november 2005 - 10:01 #39
det virker, det skulle jeg nok selv have set. ;)
Sidste spørgsmål snepnet, den får du 60 points for, jeg laver en points spørgsmål til det.

Spørgsmålet: Problemet er at efter en auktion er lukket, dvs. timer elapsed eventet bliver udført, så skal jeg tjekke auktionen af i min db for værende lukket, da det så ikke skal vises i min dynamisk tabel, nu er problemmet at når timeren når 0.0.0.0 på en auktionen bliver elapsed eventet udført flere gange (4 gange) på samme auktion. Så hvis jeg kalder min db kald til at tjekke auktionen af i timer elapsed handleren vil den blive kaldt flere gang. Jeg har prøvet, men kan ikke se hvorfor elapsed handleren bliver udført
Avatar billede ihtezaz Praktikant
30. november 2005 - 10:02 #40
sorry til sidst skulle der stå, "hvorfor elapsed handleren bliver udført flere gange når auctionen lukker"
Avatar billede snepnet Nybegynder
30. november 2005 - 10:11 #41
hm.... det lyder lidt underligt. det er ikke et problem jeg har her, og umiddelbart skulle det ikke rigtig kunne lade sig gøre.
hvordan konstaterer du at elapsed kaldes 4 gange efter at auktionen er afsluttet?
mvh
Avatar billede snepnet Nybegynder
30. november 2005 - 10:12 #42
(du kan ikke oprette flere spørgsmål - du har jo allerede givet max for dette)
Avatar billede ihtezaz Praktikant
30. november 2005 - 10:17 #43
jeg har prøvet med breakpoint inde i elaped handleren på auktion klassen og vente på auktions timer når 0.0.0.0 .jeg vil bare oprette et nyt spørgsmål og kalde det "points til snepnet".
Avatar billede ihtezaz Praktikant
30. november 2005 - 10:19 #44
Jeg har dog lavet om på auctionserver klassen, således den ikke adder til et arraylist, da jeg kun vil vise timer for en auktion af gangen.
Avatar billede snepnet Nybegynder
30. november 2005 - 10:20 #45
ahh... må jeg se den klasse - og eventuelt den kode du opretter auktioner med?
Avatar billede ihtezaz Praktikant
30. november 2005 - 10:27 #46
ja da..

Her er auctionserver klassen:

using System;
using System.Collections;

namespace Auction.Business
{
    /// <summary>
    /// Summary description for AuctionServer.
    /// </summary>
    public class AuctionServer
    {
        private static Auction auction;

        static AuctionServer()       
        {   
           

        }

        public static Auction Auction
        {
            get
            {
                return AuctionServer.auction;
            }
        }

        public static void CreatAuction(int auctionId,decimal startPrice, decimal increaseAmount, DateTime expireDate,string title,string description,int categoryId, int itemId)
        {
            Auction auction2 = new Auction(startPrice,increaseAmount,expireDate,title);
            auction2.AuctionId = auctionId;
            Item item = new Item(description,categoryId);
            item.ItemID = itemId;
            auction2.GetSetItem = item;
            auction = auction2;
        }
    }
}


og min showauctions metode:


private void ShowAuctions(string itemID)
        {
            StringBuilder array = new StringBuilder();

            Table tbl = new Table();
            tbl.BorderWidth = 0;
            tbl.GridLines = GridLines.Both;
            Panel p = (Panel) form1.FindControl("Panel1");//Controls.Add(tbl);
            int count = 0;

            TableRow tr = null;
            TableCell tc = null;
           

            sessionAuction = new Auction.Business.Sessions.SessionAuctionObject();   
            Business.Auction auction2 = sessionAuction.AuctionTransfer;

            Business.AuctionServer.CreatAuction(auction2.AuctionId,auction2.StartPrice,auction2.Increseamount,auction2.ExpireDate,auction2.Title,auction2.GetSetItem.Description,auction2.GetSetItem.CategoryID,auction2.GetSetItem.ItemID);

                tr = new TableRow();
//                tc = new TableCell();
//                tc.Text = auction.Title;
//                tr.Cells.Add(tc);
//                tbl.Rows.Add(tr);
       
                tc = new TableCell();
                tc.ID = "timeLabel_" + count.ToString();           
                tc.Text = String.Format("{0}:{1}:{2}", auction2.TimeLeft.Hours, auction2.TimeLeft.Minutes, auction2.TimeLeft.Seconds);
                tr.Cells.Add(tc);
                tbl.Rows.Add(tr);

                p.Controls.Add(tbl);
                array.Append("'");
                array.Append(tc.ClientID);
                array.Append("'");
                   
            this.RegisterArrayDeclaration("auctionFields", array.ToString());
            if (AuctionServer.Auction !=null)
            {
                body.Attributes.Add("onload", "updateTime();");
            }
        }
Avatar billede snepnet Nybegynder
30. november 2005 - 10:34 #47
mmm... jeg kan ikke se alt hvad der sker i din kode - men prøv at sæt et breakpoint i constructoren på auktionsklassen og se om du ikke få oprettet lidt flere auktioner end du tror.
mvh
Avatar billede ihtezaz Praktikant
30. november 2005 - 10:47 #48
oki, tjekker det lige
Avatar billede ihtezaz Praktikant
01. december 2005 - 02:04 #49
Igen havde du ret den god snepnet, jeg oprettede samme auktion flere gang, da jeg bruger auctions klassen som en dto, har løst det ved at lave en overloadet constructor, der tager true hvis auktion timeren skal starte og elapsed eventet skal tilføjes. Jeg opretter et spørgsmål "points til snepnet", som du bedes besvar og mange tak for din hjælp. :)
Avatar billede snepnet Nybegynder
01. december 2005 - 02:11 #50
det var i hvert fald så lidt :o)

jeg tror ikke det er nogen god idé med det ekstra spørgsmål når der allerede er givet maxpoint for dette spm.
reglerne siger at det ikke er tilladt at udlove flere point end 200 ved at dele det over flere spørgsmål.

men.... det er i hvert fald pænt af dig, så tak for tanken :o)

mvh
Avatar billede ihtezaz Praktikant
12. februar 2006 - 01:05 #51
H
Avatar billede ihtezaz Praktikant
12. februar 2006 - 01:07 #52
Hej snepnet
Jeg ville lige høre om det ok jeg oprettet en ny spørgsmål omkring denne spørgsmål, da jeg har en sidste problem omkring uret, der gør at jeg ikke kan gør min auktion helt færdigt.
Avatar billede snepnet Nybegynder
12. februar 2006 - 08:40 #53
du kan bare spørge her - jeg skal nok kigge på det :o)
(jeg smutter dog her om lidt, men dukker nok op igen senere ;o)
mvh
Avatar billede ihtezaz Praktikant
12. februar 2006 - 14:53 #54
Takker snepnet,
Den problem jeg har, er følgende:
Når forskellige brugere surfer forskellige auktioner, får alle bruger vist uret
for den auktion, den seneste brugere gik ind på. Jeg ved hvad grund til dette er,
det er fordi min Handler klasse, bruger statisk object "auktion" på min AuctionServer klasse, til
at vise auction.TimeLeft og denne statisk object "auktion" bliver sat i min showAuction.aspx, dvs.
såsnart en bruger besøger en auktion. Men jeg ved ikke helt hvordan jeg kan erstatte denne løsning
med noget andet. Jeg har prøvet istedet, at sende en auktion object fra min showAuction.aspx til handler klassen,
dette fungere, for så får alle deres egne auktionstider, men det lægger min webserver ned
hvilket er klart, med alt det session interaktion. 
Håber du kan hjælpe mig med en løsning, snepnet.

Hvis du skal bruge koden, siger du bare til.

På forhånd tak.
Avatar billede ihtezaz Praktikant
13. februar 2006 - 00:15 #55
nu har jeg lavet, den static auction object til et static arraylist med auctioner,
men problemmet er at jeg får vist tider for alle auctioner på den auction man har valgt at se. Hvis man kunne i sin script give en auctionID med til handleren, der fortalte den hvilken tid man ville hav returneret ville det nok løse problemmet, men ved ikke helt hvordan det kan gøres.
Avatar billede snepnet Nybegynder
18. februar 2006 - 01:34 #56
nå sorry ... du har spurgt her kan jeg se :o(
(jeg har ikke været her på det sidste... håber du kan bruge det svar jeg gav i det andet spørgsmål).
mvh
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