22. maj 2006 - 21:51Der er
26 kommentarer og 1 løsning
asp:Repeater + multiple asp:checkbox(e) og værdisætning
Hejsa
Jeg har et mindre problem med nedestående kode. Jeg skal have en checkbox for hvert repeat (til admin del hvor man så kan vælge hvilke repeats man vil slette). Her har jeg så brug for at kunne sætte værdien af checkboxen til det korrekte id , og derudover navngivne felterne så jeg får et array tilbage. I gammeldaws html/asp/php/jsp ville man bruge name="foobar[]" men dette lader ikke til at være tilladt i ASP.NET, så hvordan ville I håntere dette ? Jeg kan heller ikke bruge en asp:checkboxlist da dette ikke virker med en repeater inden I.
Du kan bare sætte en checkbox ind i din template, og så (når du skal checke dem i koden) iterere over dine repeateritems og kigge på den enkelte checkbox. Altså en: <asp:CheckBox id="chkChoice" runat="server" Text='<hvad du nu vil databinde til>' />
Og så når du vil finde dem igen: foreach(RepeaterItem item in msglist.Items) { CheckBox cb = item.FindControl("chkChoice") as CheckBox; // ... her har du så både din checkbox, og dit repeateritem }
hmm well.. det var ikke så glad for at virke :-) Manglede koden til at lave loopet alligevel.
Dog er de altid unchecked, selvom jeg krydser dem af. Hvilket er lidt weird. Og nej jeg bruger 1.1 lige nu. Opgradere senere , skal lige lære sproget først.
Mig bekendt har den det bare ikke.... Hverken det ene eller andet sted. Hvad skulle den angive? De er vel ikke unchecked hvis du laver en Checked='<%# DataBinder.Eval(Container.DataItem, "someBoolean")'/> Og someBoolean er true. Mvh
Virker fint, hvis jeg bruger Text så sætter den en <label> efter min checkbox hvilket jeg ikke ønsker. Men nu kan jeg ikke aflæse værdien, og ved aflæsning er de alle False ligegyldigt hvad.
void DeleteChecked(object sender,EventArgs e) { foreach(RepeaterItem item in msglist.Items) { CheckBox cb = item.FindControl("chkChoice") as CheckBox; Response.Write(cb.Text); // tom, .Value findes ikke Response.Write(cb.Checked.ToString()); // altid False Response.Write("<br>"); if(cb.Checked) { Response.Write(cb.Text); } } }
Du databinder hver gang... Det er sådan lidt det samme som at nulstille... Pak din databindingskode i page_load ind i den her: if(!IsPostBack) { // din kode }
Når checkbox nr. 2 med værdien "2" er checket, skal der slettes en række i databasen med det ID. Normalt (I alle andre webdev sprog) sætter man værdien på checkboxen, looper dem igennem og
if(checkbox is checked) { delete(checkbox_value) } (psudo)
Næh ... jeg tror nu ikke jeg misforstår dig. Der er ikke en value-property på en asp:CheckBox, så du må lægge det du normalt lægger i value et andet sted - f.eks. i et skjult felt i dit repeateritem som du så kan hente i forbindelse med at du itererer over dine items. Alternativt skal du lave din egen checkbox - og lade den have en value-property. Mvh
"f.eks. i et skjult felt i dit repeateritem som du så kan hente i forbindelse med at du itererer over dine items."
Hvordan kan jeg gøre dette... værdien skal jo have en direkte refferance til checkboksen, da jeg har fra 1-1323525 checkbokse på siden. Lyder rimelig fucked up at ASP.NET ikke har value på en checkbox da dette da har været siden HTML 3.
"(ellers kan du self. også benytte en html checkbox og give den en runat="server" ... den har en value-property)" Nej, fordi at CheckBox classesn i C# kan ikke aflæse denne værdi -_-
Du kan som sagt lave din egen checkbox der har bemeldte property (eller hente den fra nettet - der er sikkert mange andre der har lavet sådan en... Det er meget få betydende kodelinier der skal produceres for den slags).
Og så synes jeg for øvrigt at det er helt ok at der ikke er en value-property... Eller i hvert fald at den brug du nævner ikke er oplagt, da jeg mener det er lidt uhendsigtsmæssig. Mvh
Hvorfor ? Hvis du bruger Text så laver den jo en Value attribute alligevel, men sætter en "label" efter checkboksen alligevel, og så kan du kun reffere til den tilhørende labels tekst.
Det er da fuldkommen ubrugeligt uden en måde at sætte value på ( som du så kunne i HtmlInputcheckBox ) ihvertfald I html sammenhæng. At lave ekstra felter ville være spilde af kode / arbejdstid / html-rendering.
Well.... Jeg synes det er mere naturligt at lægge sit id på den bærende entitet - i det her tilfælde dit repeateritem - istedet for at lægge det på funktionsbærende kontrol under dit item. Hvis du nu har en textbox, en dropdownlist og en knap der skal tilbyde tilsvarende funktionalitet - skulle du med den programmeringsmodel du nævner lægge dit id på dem alle... Det mener jeg egentlig i højere grad giver dig ekstra arbejdstid og html output.
DataGrid / GridView er listekomponenter der kan håndtere den slags ved angivelse af en nøgle (DataKey), men en repeater er en meget generel kontrol der kan benyttes hvis man vil have så lidt som muligt foræret / hænges op på så lidt grundfunktionalitet som muligt, og den understøtter det ikke direkte. Det synes jeg dog ikke ændrer på, at id'et hører hjemme på rækken, og ikke på den enkelte funktionsbærende kontrol under rækken.
Mvh
Synes godt om
Ny brugerNybegynder
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.