Avatar billede Driton Seniormester
19. november 2011 - 15:39 Der er 23 kommentarer og
1 løsning

Hvordan man finder en div inde i en repeater

jeg har problemer med at finde min div inde i en repeater. har søgt lidt rundt på nettet, men kan ikke finde det helt.

er der nogle som kan hjælpe mig lidt ud her?
Avatar billede softspot Forsker
19. november 2011 - 17:41 #1
Hvis du har markeret den med et id og runat="server" kan du finde den i itemcommand, itemcreated og itemdatabound-events.

Eksempelvis i ItemCommand-eventet:

void rpt_ItemCommand(object source, RepeaterCommandEventArgs e)
{
  HtmlContainerControl div = (HtmlContainerControl)e.Item.FindControl("divId");
  if(div != null)
    div.Attributes["class"] = "commanded-item";
}


Såfremt du har givet det div der skal styles id'et "divId", eksempelvis (totalt utestet, men for illustrationens skyld):

<asp:Repeater id="rpt" runat="server" OnItemCommand="rpt_ItemCommand">
  <ItemTemplarte>
    <div id="divId" runat="server">Tekst</div>
    <asp:LinkButton runat="server" CommandName="test">Klik mig</asp:LinkButton>
  </ItemTemplarte>
</asp:Repeater>
Avatar billede Syska Mester
19. november 2011 - 18:27 #2
et Panel bliver renderet som en div (hvis jeg husker rigtigt).

Lyder mere som design problem, hvis du skal have fat i det den anden vej rundt. Der er dog mange cases hvor det kan være meget smart.

Hvad er det du prøver at opnå? Kan ske at der findes en smartere måde det kan løses på.

mvh
Avatar billede Driton Seniormester
20. november 2011 - 14:08 #3
Jeg har en kode som ser sådan her ud

private void Hentudbudtekurser()
    {
        Panel_visdropdown.Visible = true;
        MultiView_VisKursus.SetActiveView(View_udbudteKurser);
        List<Udbudtekurser> udbudteKurser = new List<Udbudtekurser>();
        SqlConnection Conn;
        SqlCommand cmd;
        SqlConnection(out Conn, out cmd);
        cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@udbudtekurser", SqlDbType.Bit).Value = true;

        Conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        string tempId = string.Empty;
        while (reader.Read())
        {
            if (reader["KursusKategoriId"].ToString() != tempId)
            {
                tempId = reader["KursusKategoriId"].ToString();
                udbudteKurser.Add(new Udbudtekurser(
                    (int)reader["KursusKategoriId"],
                    (int)reader["Varighed"],
                    (string)reader["Semester"],
                    (DateTime)reader["Begynder"],
                    (int)reader["KursusKatelogId"],
                    (string)reader["Niveau"],
                    (string)reader["Titel"],
                    (string)reader["Billede_Lille"],
                    (string)reader["Kode"],
                    (string)reader["KortBeskrivelse"],
                    (string)reader["Fornavn"],
                    (string)reader["Efternavn"],
                    (bool)reader["Tilmeldning"],
                    (int)reader["Pladser"]));

            }

           


        }
        Conn.Close();
        Repeater_udbudteKurser.DataSource = udbudteKurser;
        Repeater_udbudteKurser.DataBind();
    }

Jeg har svært at se hvordan jeg skal importere denne stykke kode ind

"void rpt_ItemCommand(object source, RepeaterCommandEventArgs e)
{
  HtmlContainerControl div = (HtmlContainerControl)e.Item.FindControl("divId");
  if(div != null)
    div.Attributes["class"] = "commanded-item";
}
"
Avatar billede Syska Mester
20. november 2011 - 17:21 #4
Jeg er stadig i tvivl om hvad du præcis prøver på.

Fortæl hvad der skal ske med ord, og ikke kode.

Det virker mere som om du vil tilføje en css class til den "row" du nu trykker på.
Det ville jeg gøre med javascript.
Avatar billede softspot Forsker
20. november 2011 - 18:52 #5
Jeg synes mere det ligner en databinding end et postback med en eller anden kommando. Hvis det er tilfældet, håndteres din udfordring nok bedre med Eval("feltnavn") de steder hvor data skal indsættes... men som buzzzz siger, så fortæl hvad det er du vil, for det er ikke let at se ud fra dit spørgsmål.
Avatar billede Driton Seniormester
20. november 2011 - 22:34 #6
Altså hvis tilmelding er true, skal den button jeg opretter dynamisk være true og finde den div jeg har i repeateren. hvor button bliver smidt i
Avatar billede Syska Mester
20. november 2011 - 22:42 #7
Som softspot skriver, hvorfor ikke gøre det i din Repeater?

Som jeg forstår det, så prøver du at sige.

Jeg skal have udskrevet min liste af kurser hvor "udbudtekurser" er true, og der skal kun være en knap til at tilmelde sig hvis feltet "tilmelding" er true. Hvordan kan jeg nemmest gøre det?

Er overstående korrekt?
Avatar billede softspot Forsker
20. november 2011 - 22:47 #8
Hvordan ser HTML-koden til din repeater ud?
Avatar billede Driton Seniormester
21. november 2011 - 18:09 #9
Ja
Avatar billede Driton Seniormester
21. november 2011 - 18:13 #10
<asp:Repeater ID="Repeater_udbudteKurser" runat="server">
              <ItemTemplate>
              <a href='kursuskatalog.aspx?kursusid=<%#Eval("KursusKatelogId") %>' "><h1 style="color:#164825; font-family:Arabic Typesetting; font-size:26px;"><%#Eval("Kode") %>&nbsp;:&nbsp;<%#Eval("Titel") %></h1></a><div style=" margin-top:-10px;">
                <p style=" border-bottom:solid 1px black; width:73px; font-size:12px;">Undervises af:</p>
                <p style=" font-size:12px; margin-left:75px; margin-top:-28px;">Ustadh&nbsp;<%#Eval("Fornavn") %>&nbsp;<%#Eval("Efternavn") %></p>
                <p style=" font-size:12px;"><img src="images/Sunni.png" height="134" width="156" style=" float:right; padding-left:25px; padding-bottom:1px; margin-top:-20px" alt="#" /><b>Niveau:</b>&nbsp;<%#Eval("Niveau")%><br /><b>Varighed:</b>&nbsp;<%#Eval("Varighed") %>&nbsp; Uger<br />
                <b>Semester:</b>&nbsp;<%#Eval("Semester") %><br /><b>Begyndelsesdato:</b>&nbsp;<%#Eval("Begynder", "{0:d.MMMM yyyy}")%><br /><b>Beskrivelse:&nbsp;</b><%#Eval("KortBeskrivelse")%><br /><a href='kursuskatalog.aspx?kursusid=<%#Eval("KursusKatelogId") %>' style=" border-bottom: 1px solid blue; font-size:12px;">Detaljer</a>
                <div id="hentbuttontilmeldning" runat="server"></div></p>
                <br />
                </div>
Avatar billede softspot Forsker
21. november 2011 - 21:59 #11
Jeg er stadig ikke helt sikker på hvad du vil, men hvis du vil det jeg tror, så kunne du måske bruge dette:

<asp:Repeater ID="Repeater_udbudteKurser" runat="server">
              <ItemTemplate>
              <a href='kursuskatalog.aspx?kursusid=<%#Eval("KursusKatelogId") %>' "><h1 style="color:#164825; font-family:Arabic Typesetting; font-size:26px;"><%#Eval("Kode") %> : <%#Eval("Titel") %></h1></a><div style=" margin-top:-10px;">
                <p style=" border-bottom:solid 1px black; width:73px; font-size:12px;">Undervises af:</p>
                <p style=" font-size:12px; margin-left:75px; margin-top:-28px;">Ustadh <%#Eval("Fornavn") %> <%#Eval("Efternavn") %></p>
                <p style=" font-size:12px;"><img src="images/Sunni.png" height="134" width="156" style=" float:right; padding-left:25px; padding-bottom:1px; margin-top:-20px" alt="#" /><b>Niveau:</b> <%#Eval("Niveau")%><br /><b>Varighed:</b> <%#Eval("Varighed") %>  Uger<br />
                <b>Semester:</b> <%#Eval("Semester") %><br /><b>Begyndelsesdato:</b> <%#Eval("Begynder", "{0:d.MMMM yyyy}")%><br /><b>Beskrivelse: </b><%#Eval("KortBeskrivelse")%><br /><a href='kursuskatalog.aspx?kursusid=<%#Eval("KursusKatelogId") %>' style=" border-bottom: 1px solid blue; font-size:12px;">Detaljer</a>
                <asp:LinkButton id="hentbuttontilmeldning" runat="server" commandname="tilmeld" commandarguments=<%# Eval("KursusId") %> visible=<%# Eval("Tilmelding")>Tilmeld</asp:LinkButton></p>
                <br />
                </div>

I codebehind skal du så reagere på CommandName == "tilmeld" i repeaterens OnItemCommand-event for at håndterer selve tilmeldingen.

Jeg antager, i eksemplet, at kurset har et kursusid, men det kan være du har en anden indentificeringsmekansme for tilmeldingshandlingen og det er så blot den du skal indsætte i stedet for Eval("KursusId") i CommandArguments.
Avatar billede Driton Seniormester
22. november 2011 - 15:19 #12
Altså, til hvert kursus er der en tilmeldings knap. denne tilmeldings knap tjekker først via af en if sætning om alle pladser er fuldt op eller ikke. hvis de er, så skal button være deaktiveret. hvis ikke så er der åben for tilmelding. men min stor problem var at hvordan jeg fandt noget inde i en repeater. men det du skrev burde virke.
Avatar billede softspot Forsker
22. november 2011 - 15:40 #13
ok, så får du et svar, i tilfælde af at du kan bruge det :-)
Avatar billede Driton Seniormester
23. november 2011 - 00:14 #14
Ved ikke hvad du mener med dit svar?
Avatar billede Syska Mester
23. november 2011 - 00:16 #15
Han siger han lægger svar, hvis du mener han har hjulpet dig med dig spørgsmål, da du ikke direkte sagde du kunne bruge det han skrev, men bare kom med en hentydning til at du faktisk brugte noget af det han skrev.
Avatar billede softspot Forsker
23. november 2011 - 00:22 #16
Ja, jeg hæftede mig ved den sidste del af dit eget svar: "men det du skrev burde virke" og opfattede det som en accept af, at det var løsningen :-)
Avatar billede Driton Seniormester
23. november 2011 - 00:50 #17
Vil det være muligt at gøre det sådan her

Button LB = new Button();
            LB.ID = "Button";
            LB.Text = "Tilmed dig";
            Repeater_udbudteKurser.FindControl("Panel_Button").Controls.Add(LB);
?
Avatar billede Driton Seniormester
23. november 2011 - 00:57 #18
Nårh, Hehe. Men nej det gjorde det ikke. jeg har lavet så mange ting og har skrevet så meget at jeg glemte det selv. :D
Avatar billede Driton Seniormester
23. november 2011 - 01:05 #19
men til den stykke kode som jeg skrev før, får jeg hele tiden denne stykke fejl meddelse nogle der ved hvorfor?

"Object reference not set to an instance of an object.""
Avatar billede Syska Mester
23. november 2011 - 01:15 #20
Hvor har du placeret det kode?

Det lyder som om at din repeater stadig er null.

Men hvorfor ikke gøre som "softspot" skriver?

Det er heller ikke helt til at finde ud af hvad du vil. Synes du hopper lidt frem og tilbage.

Vi har heller ingen ide om hvor din data kommer fra. Lyder som om du henter den fra serveren ... derefter laver lidt procesering for at finde ud af om der stadig er pladser. Hvis der er pladser sætter du en værdi til "Tilmelding" til true.
Men det er kun gæt.

mvh
Avatar billede Driton Seniormester
23. november 2011 - 01:33 #21
Lige nu prøver jeg bare at generere en knap med lidt statisk indhold. for at se om jeg kan finde ud af at sætte en knap inde i et panel.

hvis jeg fjerner denne stumpe kode
Panel newpanel = (Panel)Repeater_udbudteKurser.FindControl("Panel_Button");
                Button LB = new Button();
                LB.ID = "Button";
                LB.Text = "Tilmed dig";
                LB.Width = 135;
                newpanel.Controls.Add(LB);

Virker min kode, og repeateren kører

Dette er min kode hvor jeg har tilføjet den henne

private void Hentudbudtekurser()
    {
        Panel_visdropdown.Visible = true;
        MultiView_VisKursus.SetActiveView(View_udbudteKurser);
        List<Udbudtekurser> udbudteKurser = new List<Udbudtekurser>();
        SqlConnection Conn;
        SqlCommand cmd;
        SqlConnection(out Conn, out cmd);
        cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@udbudtekurser", SqlDbType.Bit).Value = true;

        Conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        string tempId = string.Empty;
        while (reader.Read())
        {
            if (reader["KursusKategoriId"].ToString() != tempId)
            {
                tempId = reader["KursusKategoriId"].ToString();
                udbudteKurser.Add(new Udbudtekurser(
                    (int)reader["KursusKategoriId"],
                    (int)reader["Varighed"],
                    (string)reader["Semester"],
                    (DateTime)reader["Begynder"],
                    (int)reader["KursusKatelogId"],
                    (string)reader["Niveau"],
                    (string)reader["Titel"],
                    (string)reader["Billede_Lille"],
                    (string)reader["Kode"],
                    (string)reader["KortBeskrivelse"],
                    (string)reader["Fornavn"],
                    (string)reader["Efternavn"],
                    (bool)reader["Tilmeldning"],
                    (int)reader["Pladser"]));

            }

          [b]Panel newpanel =  (Panel)Repeater_udbudteKurser.FindControl("Panel_Button");
                Button LB = new Button();
                LB.ID = "Button";
                LB.Text = "Tilmed dig";
                LB.Width = 135;
                newpanel.Controls.Add(LB);



        }
        Conn.Close();
        Repeater_udbudteKurser.DataSource = udbudteKurser;
        Repeater_udbudteKurser.DataBind();
    }

" [/b]
Avatar billede Syska Mester
23. november 2011 - 02:01 #22
Jeg tvivler på du kan finde noget som helst i din Repeater før du har kaldt "DataBind()" på den.

Så dit Panel er nok null ... og derfor den exception.

Men hvorfor gøre det så besværligt og ikke bare smide den knap ind på din aspx side.

Det virker som om du hellere vil løbe jorden rundt for at komme i mål. Som er sådan ca. 10 meter foran dig.

mvh
Avatar billede softspot Forsker
23. november 2011 - 08:27 #23
Det virker som om du kommer fra en anden platform end ASP.NET og at du gerne vil gennemtvinge din sædvanlige måde at gøre tingene på. Det er bare ikke oplagt at gøre det du illustrerer med din kode, på den måde du gør.

Det jeg har vist dig i #11 ville være den oplagte måde at gøre det på når du bruger webforms og server controls (den findes i forskellige variationer, men i princippet).
Avatar billede softspot Forsker
23. november 2011 - 08:29 #24
Ups! Sorry buzzzz, jeg så ikke din kommentar, men kan så konstatere at jeg jo er helt enig med dig :-)
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