Avatar billede thomas_regin Nybegynder
03. februar 2005 - 11:12 Der er 24 kommentarer og
1 løsning

Klassisk spm: Checkboxes i Repeater (C#)

Hejsa!

Ja, her er så endnu et spørgsmål om det klassiske problem, Checkboxe i Repeater, og jeg håber i kan hjælpe!

Synopsis:
I min webform har jeg 3 nestede repeaters:

rpWeeks
---- rpTime
------- rpClasses

Jeg binder data til disse nestede repeaters ved at benytte "OnItemDataBound" events på hver af repeaterne, og det virker helt perfekt!

Problemet:
På mine CheckBox'e har jeg sat AutoPostBack=true, og fanger "OnCheckedChanged"-eventen, og herinde vil jeg meget gerne have adgang til det RepeaterItem, som CheckBoxen er et Child af! Men det virker ikke!

public void chkClass_CheckedChanged(object sender, EventArgs e)
{
  CheckBox c = (CheckBox)sender;
  RepeaterItem r = (RepeaterItem)c.Parent; //Dette virker
  DataRowView drv = (DataRowView)r.DataItem; //DataItem er NULL !
}

Problemet er altså at RepeaterItem.DataItem er NULL, og det tager jeg som et udtryk for, at repeaterne's state ikke bliver bevaret hen over postbacks!

Hvordan løser jeg dette problem?

Tak for hjælpen! :D

Thomas.
Avatar billede snepnet Nybegynder
03. februar 2005 - 17:25 #1
Hej Thomas.... hvis du kun databinder ved !IsPostBack vil du nok aldrig have et dataitem til rådighed i en handler.
får du samme resultat hvis du databinder ved hvert roundtrip (for testens skyld indtil videre).

og... hvad skal du helt præcist bruge dit dataitem til i handleren ?

mvh
Avatar billede thomas_regin Nybegynder
03. februar 2005 - 17:35 #2
Hejsa Snepnet!

Tak for dit svar!

Som det er lige nu, binder jeg ganske rigtigt kun i !IsPostBack! Problemet er, hvis jeg binder på andre tidspunkter, at min "CheckBox-state" (Checked/Unchecked) forsvinder, hvis jeg binder andre steder!

Jeg skal bruge mit dataitem i handleren for at finde ud af hvilke værdier der er checket af! Jeg benytter et Typed Dataset til at binde mine kontroller, og værdierne i dette dataitem skal bruges til at opbygge en formular! Derfor nytter det ikke noget, at jeg kun har en checkbox værdi på true/false, når jeg ikke ved hvilket dataitem der er "true/false" !

Det kan være der findes en lettere måde, men den kender jeg så ikke?

På forhånd tak for hjælpen,

Thomas.
Avatar billede snepnet Nybegynder
03. februar 2005 - 19:47 #3
halløj igen :o)

du kan vælge en meget enkel løsning ved enten at sikre identifikationen på din index :
RepeaterItem r = (RepeaterItem)c.Parent;
dit index vil så være her :
int index = r.ItemIndex;

Ellers kan du sætte et id fra basen (hvis det er det du skal bruge) direkte på din checkbox ved :
someCheckBox.Attributes.Add("DbId",someDbId);

og så hente det igen ved :
int id = int.Parse( ((CheckBox)sender).Attributes["DbId"]);

Du vil så efterfølgende kunne finde rækken i datasættet på dette id..... Vil det være tilstrækkeligt for dig for at løse problemet ?

mvh
Avatar billede thomas_regin Nybegynder
03. februar 2005 - 23:24 #4
Hejsa igen Snepnet!

Tak for dit svar!

Jeg har ingen ID'er fra DB'en idet min datasource er et nested XML-schema, så muligheden for at lægge et ID i selve Checkboxen er ikke umiddelbart ikke tilgængelig.

Til gengæld prøvede jeg det andet forslag du gav, og det virkede sjovt nok heller ikke, for r.ItemIndex er hele tiden 0 !! Og det forstår jeg simpelthen ikke!

Er det fordi jeg skal binde et andet sted end i !IsPostBack?

På forhånd tak,

Thomas
Avatar billede snepnet Nybegynder
03. februar 2005 - 23:54 #5
Hmm.... altid 0 ?!? det er lidt sært.
Du kan lige prøve at se dette vældig simple eksempel.... Det skulle meget gerne virke som beskrevet.
(Du kan jo lægge hvilket som helst værdi til genkendelse i din attribute-collection på checkboxe hvis det kan hjælpe).

// En aspx-fil :
<%@ Page language="c#" Codebehind="RepeaterSager.aspx.cs" AutoEventWireup="false" Inherits="EXP2.RepeaterSager" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>RepeaterSager</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <asp:Repeater id="Repeater1" runat="server">
                <ItemTemplate>
                    <asp:Label ID="lblName" Runat="server">
                        <%# DataBinder.Eval(Container, "DataItem.FldString") %>
                    </asp:Label>
                    <asp:CheckBox ID="chkCheck" Runat="server" OnCheckedChanged="chkCheck_CheckedChanged" AutoPostBack="True"></asp:CheckBox>
                </ItemTemplate>
                <SeparatorTemplate>
                    <br>
                </SeparatorTemplate>
            </asp:Repeater>
        </form>
    </body>
</HTML>


// og en code-behind
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using ExpArticles.ExpData;

namespace EXP2
{
    public class RepeaterSager : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Repeater Repeater1;
   
        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                SampleDataSet ds = soemGetDataThing();
                Repeater1.DataSource = ds;
                DataBind();
            }
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }

        protected void chkCheck_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox c = (CheckBox)sender;
            RepeaterItem r = (RepeaterItem)c.Parent;
            int index = r.ItemIndex;
        }
    }
}
Avatar billede snepnet Nybegynder
03. februar 2005 - 23:57 #6
Og næh nej... det er bestemt ikke fordi du skal binde et andet sted... ovenstående model skulle du meget gerne kunne få til at virke efter hensigten. ellers er der virkelig gået spøgelser i det :o)
mvh
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 12:10 #7
Hejsa igen Snepnet!

Jeg har endnu ikke har mulighed for at afprøve dit eksempel, men jeg betvivler ikke, at det virker! ;)

Jeg er dog kommet til den konklusion i mine overvejelser, at det må være et state-problem, i og med, at RepeaterItem.DataItem er NULL, når siden har haft PostBack, og det er det jeg skal forsøge at løse nu!

Det har nok noget at gøre med, at jeg har 3 repeaters på siden, som ikke bliver bundet når der har været postback! Jeg troede dog, at dette blev håndteret af ViewState'n!

Det sjove er, at jeg har adgang til kontrollerne efter postback! Bare ikke noget data! Jævnfør følgende "test"-loop, som bliver fyret af på en postback:

private void Calculate()
        {
            foreach (RepeaterItem _rWeek in rpWeeks.Items)
            {
                Repeater rpTime = (Repeater)_rWeek.FindControl("rpTime");
                foreach (RepeaterItem _rTime in rpTime.Items)
                {
                    Repeater rpClasses = (Repeater)_rTime.FindControl("rpClasses");
                    foreach (RepeaterItem _rClass in rpClasses.Items)
                    {
                        CheckBox c = (CheckBox)_rClass.FindControl("chkClass");
                        if (c.Checked)
                        {
                            balletDataset.classnameRow _cnr = (balletDataset.classnameRow)_rClass.DataItem;
                            if (_cnr != null)
                            {
                                //_cnr er NULL og jeg kommer ikke videre!!
                                Response.Write(_cnr.teacher + "<br>");
                            }
                        }
                    }
                }
            }
        }

Som sagt er alle "ItemIndex" 0 og RepeaterItem.DataItem er NULL !

Hvad i hulens navn på der galt??

/thomas.
Avatar billede snepnet Nybegynder
04. februar 2005 - 12:55 #8
hej igen thomas :o)

du skal ikke regne med at dit dataitem bliver retableret ved viewstate, og hvis du vil være sikker på at have dit dataitem til rådighed "hele tiden", vil jeg anbefale dig at lægge data i session - og sørge for at påtrykke disse data på din repeatere ved hvert roundtrip.

det med at dit ItemIndex er 0 er temmelig underligt synes jeg, men jeg kan nu ikke se at du kigger på itemindex i den løkke du har sendt.

må jeg se den kode hvor du kalder Calculate ?

mvh
Avatar billede snepnet Nybegynder
04. februar 2005 - 12:58 #9
jeg synes du skal prøvet at samle et itemcommand op på repeateren istedet - der skulle du meget gerne kunne finde både din checkbox, og også få det rigtige itemindex.
(du kan også i det tilfælde kigge på sender - og typecaste til en checkbox).

kan du ikke også skrive om du tilføjer handleren af checked_changed eventet dynamisk - eller deklerativt ? - og måske vise lidt kode for det.

mvh
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 13:16 #10
Halløjsa Snepnet,

Jeg har allerede mit dataset liggende i en Session! Problemet er, hvis jeg binder min data for hvert roundtrip, så mister jeg checkbox-staten! :(

Det er korrekt, at jeg ikke skriver ItemIndex ud i den ovenstående løkke, men HVIS jeg gør det (Response.Write(_rClass.ItemIndex)) så er den 0!

Jeg kalder den ovenstående test-løkke direkte i OnCheckedChanged-eventen!

public void chkClass_CheckedChanged(object sender, EventArgs e)
{
  Calculate();
}

Med hensyn til "CheckedChanged"-eventen så bliver den added Deklerativt i selve <asp:checkbox - tagget i .ASPX-filen, men jeg har også prøvet at tilføje det i selve "OnItemDataBound"-eventhandleren! Problemet med sidstnævnte er, at når siden har haft postback, så ryger de events også! :(

Jeg forsøger lige med "ItemCommand" handleren istedet og vender tilbage!

Stadig tak for din hjælp !! :o)

/thomas
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 13:23 #11
Hej igen!

Godt så! Nu har jeg testet med ItemCommand-handleren! Og det virkede heller ikke! Den bliver faktisk slet ikke kaldt!

Jeg kalder Handleren via .ASPX-filen i OnItemCommand-tagget:

<asp:Repeater OnItemCommand=rpClasses_ItemCommand Runat="server" ID="rpClasses">

Og i Codebehind:
public void rpClasses_ItemCommand(object sender, RepeaterCommandEventArgs e)
    {
            Response.Write("La la la la");
    }

Og der sker ikke en fløjtende fis! Hverken før, efter eller under PostBack! :'(

Hvor svært kan det være! Jeg synes ihvertfald at dette er ultra-mærkeligt!

/thomas.
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 13:40 #12
PS.: Jeg vil gerne sende dig hele koden, men så må jeg lige ha' din mail-addr. for jeg vil helst ikke smide den op her! Den er ret lang!

/thomas
Avatar billede snepnet Nybegynder
04. februar 2005 - 13:52 #13
ok
du skulle også have et ItemCreated event du kan abbonere på ... det bliver kaldt hver gang, og ikke kun ved databinding.
(det vil så være det rigtige sted hvis du vil lægge handlers på diverse events).

F.eks. sådan her :
private void Repeater1_ItemCreated(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        ((CheckBox)e.Item.FindControl("chkCheck")).CheckedChanged += new EventHandler(RepeaterSager_CheckedChanged);
}

private void RepeaterSager_CheckedChanged(object sender, EventArgs e)
{
    CheckBox c = (CheckBox)sender;
    RepeaterItem r = (RepeaterItem)c.Parent; //Dette virker
    int index = r.ItemIndex;   
}

Kan du ikke prøve ovenstående, og se om du ikke får et itemindex ud ?

mvh
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 13:57 #14
.ASPX
<asp:Repeater OnItemCreated=rpClasses_ItemCreated Runat="server" ID="rpClasses">

Codebehind:

public void rpClasses_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                CheckBox c = (CheckBox)e.Item.FindControl("chkClass");
                c.CheckedChanged += new EventHandler(c_CheckedChanged);
            }
        }

        public void c_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox c = (CheckBox)sender;
            RepeaterItem r = (RepeaterItem)c.Parent;
            Response.Write(r.ItemIndex + "<br>");
        }

Output: 0

Jeg fatter det ikke! :'(
Avatar billede snepnet Nybegynder
04. februar 2005 - 14:00 #15
er forholdet det samme om du bruger den øverste repeater - eller en af de nestede ?
mvh
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 14:12 #16
Hmmm...

Jeg har lige opdaget noget med min "OnCheckedChanged"-event! Den udskriver faktisk enten 0 eller 1 afhængigt af hvilken checkbox jeg udskriver:

<asp:Repeater OnItemCreated=rpClasses_ItemCreated Runat="server" ID="rpClasses">
                                                    <ItemTemplate>
                                                        <td width="175" valign="top">
                                                            <strong>
                                                                <asp:Label Runat="server" ID="lblTitle">
                                                                    <%#DataBinder.Eval(Container.DataItem,"title")%>
                                                                </asp:Label>
                                                            </strong>
                                                            <asp:Label Runat="server" ID="lblSubTitle">
                                                                <%#DataBinder.Eval(Container.DataItem,"subtitle")%>
                                                            </asp:Label>
                                                            <br>
                                                            <asp:Label Runat="server" ID="lblTeacher">
                                                                <%#DataBinder.Eval(Container.DataItem,"teacher")%>
                                                            </asp:Label>
                                                            <asp:Label Runat="server" ID="lblPrice" Visible="False">
                                                                <%#DataBinder.Eval(Container.DataItem,"price")%>
                                                            </asp:Label>
                                                        </td>
                                                        <td>
                                                            <asp:CheckBox AutoPostBack=True OnCheckedChanged=c_CheckedChanged Runat="server" ID="chkClass"></asp:CheckBox>
                                                        </td>
                                                    </ItemTemplate>
                                                </asp:Repeater>

Som du kan se, så genererer denne repeater checkboxene således:

<td>Første Checkbox</td></td>Anden checkbox</td>

Og afhængigt hvilken af disse checkboxe, der klikkes af, så får jeg "0" eller "1" i ItemIndex på "OnCheckedChanged" eventen! Men det hjælper mig stadig ikke til at finde ud af hvilket data der ligger i RepeaterItem.DataItem !

/thomas
Avatar billede snepnet Nybegynder
04. februar 2005 - 14:29 #17
tror ikke jeg er helt med ... jeg kan kun se én checkbox i det du lige har sendt.

men på ovenstående repeater skal du self. have 0 som ItemIndex i første række, 1 som ItemIndex i anden række, 3 i tredie osv..

mvh
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 14:51 #18
Hejsa igen snepnet,

Nu har jeg gjort noget andet!

Jeg har lagt det hele op på min server, så du kan se det i aktion, samt kigge på sourcekoden:

Fejlen opstår på følgende side:
http://www.bournonville.dk/registration/classselector.aspx?g=2663829a-2f7d-4c78-9c3b-c53ab9abde56

.ASPX-filen:
http://www.bournonville.dk/registration/Classselector.aspx.txt

.cs-filen:
http://www.bournonville.dk/registration/Classselector.aspx.cs.txt

Bruger-informationen kommer fra en XML-fil, som bliver genereret på side 1 af denne formular (default.aspx) !

Thomas
Avatar billede snepnet Nybegynder
04. februar 2005 - 15:11 #19
Hej Thomas.
Jeg må lige vente med at kigge på det ... der er jo en hel del kan man sige :o)
håber det er ok.
jeg kan muligvis se på sent i aften, men ellers imorgen formiddag.
Mvh
/Snep
Avatar billede thomas_regin Nybegynder
04. februar 2005 - 15:15 #20
S'føli!.. :-D

Jeg er bare glad for, at der er nogen som kan/gider at hjælpe! :D

/thomas
Avatar billede snepnet Nybegynder
05. februar 2005 - 17:15 #21
Hej igen - så er det formiddag (og lidt til :o)
kan du ikke prøve - bare for et check - at skifte .Parent ud med .NamingContainer ?
mvh
Avatar billede thomas_regin Nybegynder
05. februar 2005 - 18:36 #22
Hejsa igen, Snepnet!

Problemet er faktisk løst på nuværende tidspunkt! Dog en rigtig fedtmule-løsning!

Istedet for at hente værdierne ud på DataItem har jeg oprettet en masse <asp:label's rundt om alle de værdier, som jeg skal bruge i repeaterne! Og disse værdier kan jeg få adgang til via Repeater.FindControl() og smide dem ind i en komma-separeret string!

Men jeg synes nu alligevel du skal ha' dine points! Du har været en god hjælp!

/thomas
Avatar billede snepnet Nybegynder
05. februar 2005 - 18:48 #23
hej igen :o)

du får da et svar så, men det er nu stadig noget sært noget.... har udvidet det eksempel jeg sendte tidligere med en nestet repeater, og det fungerer helt som forventet.

jeg har ikke lige kunnet se hvad det er der gør at din kode driller.

... hvis du gerne vil have det udvidede eksempel siger du bare til.

mvh
Avatar billede thomas_regin Nybegynder
05. februar 2005 - 19:27 #24
Hejsa igen Snepnet!

Jeg vil da meget gerne se dit udvidede eksempel, men jeg har det lidt skidt med at smide min mail-adresse her! Har du evt. en FTP eller lign. som jeg kan hente det fra?

Tak for hjælpen ! :o)

/thomas
Avatar billede snepnet Nybegynder
05. februar 2005 - 19:30 #25
Det var i hvert fald så lidt :o)

Du kan bare få det her (der er ikke så meget mere end der var i det andet) :

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using ExpArticles.ExpData;

namespace EXP2
{
    public class RepeaterSager : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.Repeater Repeater1;
        protected System.Web.UI.WebControls.Repeater ChildRepeater;

        private void Page_Load(object sender, System.EventArgs e)
        {
            if(!IsPostBack)
            {
                SampleDataSet ds = new ExpArticles.ExpData.ExpDataAccess().GetSampleData(10);
                Repeater1.DataSource = ds;
                DataBind();
            }
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Repeater1.ItemCreated += new RepeaterItemEventHandler(Repeater1_ItemCreated);
            this.Repeater1.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.Repeater1_ItemDataBound);
            this.Load += new System.EventHandler(this.Page_Load);
        }

        protected void chkCheck_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox c = (CheckBox)sender;
            RepeaterItem r = (RepeaterItem)c.Parent; //Dette virker
            int index = r.ItemIndex;
        }

        private void Repeater1_ItemCreated(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
                ((CheckBox)e.Item.FindControl("chkCheck")).CheckedChanged += new EventHandler(RepeaterSager_CheckedChanged);
        }

        private void Repeater1_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
        {
            Repeater rep = (Repeater)e.Item.FindControl("ChildRepeater");
            if(rep != null)
            {
                rep.DataSource = GetChildData();
                rep.DataBind();
            }
        }

        private void RepeaterSager_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox c = (CheckBox)sender;
            Control container = c.NamingContainer;
            RepeaterItem r = (RepeaterItem)c.NamingContainer;
            int index = r.ItemIndex;   
            Response.Write(String.Format("LastItemIndex : {0}", index));
        }

        protected void ChildCheckBoxCheckedChanged(object sender, EventArgs e)
        {
            CheckBox c = (CheckBox)sender;
            Control container = c.NamingContainer;
            RepeaterItem r = (RepeaterItem)c.NamingContainer;
            int index = r.ItemIndex;   
            Response.Write(String.Format("LastItemIndex : {0}", index));
        }

        protected DataSet GetChildData()
        {
            return new ExpArticles.ExpData.ExpDataAccess().GetSampleData(5);
        }
    }
}


// og en aspx-fil
<%@ Page language="c#" Codebehind="RepeaterSager.aspx.cs" AutoEventWireup="false" Inherits="EXP2.RepeaterSager" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>RepeaterSager</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body>
        <form id="Form1" method="post" runat="server">
            <asp:Repeater id="Repeater1" runat="server">
                <ItemTemplate>
                    <asp:Label ID="lblName" Runat="server">
                        Parent : <%# DataBinder.Eval(Container, "DataItem.FldString") %>
                    </asp:Label>
                    <br>
                    <asp:Repeater ID="ChildRepeater" Runat="server">
                        <ItemTemplate>
                            <asp:Label ID="Label1" Runat="server">
                                Child : <%# DataBinder.Eval(Container, "DataItem.FldString") %>
                            </asp:Label>
                            <asp:CheckBox ID="chkChildCheck" Runat="server" AutoPostBack="True" OnCheckedChanged="ChildCheckBoxCheckedChanged"></asp:CheckBox>
                        </ItemTemplate>
                        <SeparatorTemplate>
                            <hr>
                        </SeparatorTemplate>
                    </asp:Repeater>
                    <br>
                    ParentCheckBox
                    <asp:CheckBox ID="chkCheck" Runat="server" AutoPostBack="True"></asp:CheckBox>
                </ItemTemplate>
                <SeparatorTemplate>
                    <hr>
                </SeparatorTemplate>
            </asp:Repeater>
        </form>
    </body>
</HTML>

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