Avatar billede tdafoobar Nybegynder
22. maj 2006 - 21:51 Der 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.

--- kode ---
<asp:Repeater ID="msglist" runat="server">
  <ItemTemplate>
    <!-- checkbox her -->
    <a href="mailto:<%# DataBinder.Eval(Container.DataItem,"strEmail") %>">
      <%# DataBinder.Eval(Container.DataItem,"strName") %>
    </a> - <span class="date"><%# DataBinder.Eval(Container.DataItem,"datDate","{0:D}") %></span>
    <p class="item">
      <%# DataBinder.Eval(Container.DataItem,"txtMessage").ToString().Replace("\n","<br />") %>
    </p>
  </ItemTemplate>
</asp:Repeater>
Avatar billede snepnet Nybegynder
22. maj 2006 - 22:00 #1
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
}

Har jeg misforstået dig?

Mvh
(Bruger du ikke 2.0?)
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:12 #2
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.
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:19 #3
Hvorfor har CheckBox ikke en "Value" attribute i C#, når den har I <asp:checkbox /> ?
Avatar billede snepnet Nybegynder
22. maj 2006 - 22:27 #4
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
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:29 #5
<asp:Repeater ID="msglist" runat="server">
            <ItemTemplate>
              <asp:checkbox id="chkChoice" runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"id") %>' />
              <a href="mailto:<%# DataBinder.Eval(Container.DataItem,"strEmail") %>">
                <%# DataBinder.Eval(Container.DataItem,"strName") %>
              </a> - <span class="date"><%# DataBinder.Eval(Container.DataItem,"datDate","{0:D}") %></span>
              <p class="item">
                <%# DataBinder.Eval(Container.DataItem,"txtMessage").ToString().Replace("\n","<br />") %>
              </p>
            </ItemTemplate>
          </asp:Repeater>

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);
      }
    }
  }
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:32 #6
Og ja, de er true hvis jeg predefinere det i ASP.NET men det ødelægger ligesom ideen med at brugeren skal vælge :p
Avatar billede snepnet Nybegynder
22. maj 2006 - 22:44 #7
Må jeg se hele din kode?
Mvh
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:45 #8
Avatar billede snepnet Nybegynder
22. maj 2006 - 22:49 #9
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
}

Mvh
Avatar billede snepnet Nybegynder
22. maj 2006 - 22:53 #10
(Og value kan du ikke rigtig bruge til noget på checkboxen ... det vil formentlig bare blive ignoreret, men det kan du checke i html'en)
Mvh
Avatar billede snepnet Nybegynder
22. maj 2006 - 22:54 #11
Skal checkboxens tilstand ikke hentes fra datagrundlaget?
Mvh
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:54 #12
goodie, virker nu. Så mangler jeg bare at få fjernet så den ikke laver en <label> efter checkboxen. Hvordan går jeg det ?
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:55 #13
"Skal checkboxens tilstand ikke hentes fra datagrundlaget?" < nej :)
Avatar billede snepnet Nybegynder
22. maj 2006 - 22:56 #14
ok :o)
du lader bare være med at give den en tekst.
Mvh
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 22:57 #15
Ja, men så har den jo ingen værdi, og jeg skal sende værdien (id'et) med, så jeg kan slette elementet i databasen.
Avatar billede snepnet Nybegynder
22. maj 2006 - 23:00 #16
Læg dit id i et skjult felt i dit repeateritem - databind mod id - og hent det derfra i din handler.
Mvh
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 23:03 #17
Du misforstår:

[(id=1)] blabla
[x (id=2)] foobar

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)
Avatar billede snepnet Nybegynder
22. maj 2006 - 23:24 #18
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
Avatar billede snepnet Nybegynder
22. maj 2006 - 23:27 #19
(ellers kan du self. også benytte en html checkbox og give den en runat="server" ... den har en value-property)
Mvh
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 23:27 #20
"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.
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 23:27 #21
"(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 -_-
Avatar billede snepnet Nybegynder
22. maj 2006 - 23:33 #22
Nej - men det kan en HtmlInputCheckBox.
Mvh
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 23:37 #23
mmm, det virkede :-) Så er vi enige. Mange tak for hjælpen.
Avatar billede snepnet Nybegynder
22. maj 2006 - 23:40 #24
Det var så lidt.

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).

Mvh
Avatar billede snepnet Nybegynder
22. maj 2006 - 23:50 #25
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
Avatar billede tdafoobar Nybegynder
22. maj 2006 - 23:53 #26
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.
Avatar billede snepnet Nybegynder
22. maj 2006 - 23:59 #27
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
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