Skrevet lør. d. 19. november 2011 kl. 17:41:13| #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>
Skrevet lør. d. 19. november 2011 kl. 18:27:58| #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
Skrevet søn. d. 20. november 2011 kl. 14:08:20| #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";
}
"
Skrevet søn. d. 20. november 2011 kl. 17:21:11| #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.
Skrevet søn. d. 20. november 2011 kl. 18:52:24| #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.
Skrevet søn. d. 20. november 2011 kl. 22:34:47| #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
Skrevet søn. d. 20. november 2011 kl. 22:42:11| #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?
Skrevet søn. d. 20. november 2011 kl. 22:47:10| #8
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
<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>
<div id="hentbuttontilmeldning" runat="server"></div></p>
<br />
</div>
Skrevet man. d. 21. november 2011 kl. 21:59:52| #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.
Skrevet tir. d. 22. november 2011 kl. 15:19:05| #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.
Skrevet tir. d. 22. november 2011 kl. 15:40:22| #13
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
Ved ikke hvad du mener med dit svar?
Skrevet ons. d. 23. november 2011 kl. 00:16:54| #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.
Skrevet ons. d. 23. november 2011 kl. 00:22:28| #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 :-)
Skrevet ons. d. 23. november 2011 kl. 00:50:57| #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);
?
Skrevet ons. d. 23. november 2011 kl. 00:57:33| #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
Skrevet ons. d. 23. november 2011 kl. 01:05:55| #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.""
Skrevet ons. d. 23. november 2011 kl. 01:15:39| #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
Skrevet ons. d. 23. november 2011 kl. 01:33:21| #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]
Skrevet ons. d. 23. november 2011 kl. 02:01:42| #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
Skrevet ons. d. 23. november 2011 kl. 08:27:40| #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).
Skrevet ons. d. 23. november 2011 kl. 08:29:11| #24
Ups! Sorry buzzzz, jeg så ikke din kommentar, men kan så konstatere at jeg jo er helt enig med dig :-)