Oprettet lør. d. 19. november 2011 kl. 15:39:05

Driton
Driton (2.050 point. Point ude: 490)

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?

Skrevet lør. d. 19. november 2011 kl. 17:41:13| #1

softspot
softspot (101.915 point)
www.softspot.dk
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>

Skrevet lør. d. 19. november 2011 kl. 18:27:58| #2

buzzzz
buzzzz (48.826 point)
ifyoudo.net
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

Skrevet søn. d. 20. november 2011 kl. 14:08:20| #3

Driton
Driton (2.050 point)
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";
}
"

Skrevet søn. d. 20. november 2011 kl. 17:21:11| #4

buzzzz
buzzzz (48.826 point)
ifyoudo.net
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.

Skrevet søn. d. 20. november 2011 kl. 18:52:24| #5

softspot
softspot (101.915 point)
www.softspot.dk
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.

Skrevet søn. d. 20. november 2011 kl. 22:34:47| #6

Driton
Driton (2.050 point)
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

Skrevet søn. d. 20. november 2011 kl. 22:42:11| #7

buzzzz
buzzzz (48.826 point)
ifyoudo.net
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?

Skrevet søn. d. 20. november 2011 kl. 22:47:10| #8

softspot
softspot (101.915 point)
www.softspot.dk
Hvordan ser HTML-koden til din repeater ud?

Skrevet man. d. 21. november 2011 kl. 18:09:42| #9


Skrevet man. d. 21. november 2011 kl. 18:13:56| #10

Driton
Driton (2.050 point)
<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>

Skrevet man. d. 21. november 2011 kl. 21:59:52| #11

softspot
softspot (101.915 point)
www.softspot.dk
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.

Skrevet tir. d. 22. november 2011 kl. 15:19:05| #12

Driton
Driton (2.050 point)
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.

Skrevet tir. d. 22. november 2011 kl. 15:40:22| #13

softspot
softspot (101.915 point)
www.softspot.dk
ok, så får du et svar, i tilfælde af at du kan bruge det :-)

Skrevet ons. d. 23. november 2011 kl. 00:14:33| #14

Driton
Driton (2.050 point)
Ved ikke hvad du mener med dit svar?

Skrevet ons. d. 23. november 2011 kl. 00:16:54| #15

buzzzz
buzzzz (48.826 point)
ifyoudo.net
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.

Skrevet ons. d. 23. november 2011 kl. 00:22:28| #16

softspot
softspot (101.915 point)
www.softspot.dk
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 :-)

Skrevet ons. d. 23. november 2011 kl. 00:50:57| #17

Driton
Driton (2.050 point)
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);
?

Skrevet ons. d. 23. november 2011 kl. 00:57:33| #18

Driton
Driton (2.050 point)
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

Skrevet ons. d. 23. november 2011 kl. 01:05:55| #19

Driton
Driton (2.050 point)
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.""

Skrevet ons. d. 23. november 2011 kl. 01:15:39| #20

buzzzz
buzzzz (48.826 point)
ifyoudo.net
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

Skrevet ons. d. 23. november 2011 kl. 01:33:21| #21

Driton
Driton (2.050 point)
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]

Skrevet ons. d. 23. november 2011 kl. 02:01:42| #22

buzzzz
buzzzz (48.826 point)
ifyoudo.net
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

Skrevet ons. d. 23. november 2011 kl. 08:27:40| #23

softspot
softspot (101.915 point)
www.softspot.dk
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).

Skrevet ons. d. 23. november 2011 kl. 08:29:11| #24

softspot
softspot (101.915 point)
www.softspot.dk
Ups! Sorry buzzzz, jeg så ikke din kommentar, men kan så konstatere at jeg jo er helt enig med dig :-)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Print fra Windows Service på Win2008

Oprettet den 24. maj 2012 kl. 11.17
jps6kb giver 200 point for svar | Giv et svar »

Udskrive en Breadcrumb (Jeg er her >>)

Oprettet den 18. maj 2012 kl. 12.04
Qbruger giver 200 point for svar | Giv et svar »

Hjælp til at lokalisere fejl i CMS (synkron.via) dll

Oprettet den 16. maj 2012 kl. 19.31
jokkejensen giver 200 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger