19. juni 2007 - 11:45Der er
9 kommentarer og 1 løsning
Dynamiske ID'er på controls
Jeg har en applikation der opretter en dynamisk række controls som jeg skal læse fra javascript.
De enkelte controls ligger under forskellige parent-controls, så jeg ved ikke helt hvor javascript skal lede.
Derfor kunne jeg godt tænke mig at lader serverside generere et javascript array der indeholder ID'et på de controls jeg ønsker at tilgå, og så benytte document.getElementById() til at finde dem i javascript.
Her kommer problemet så.. Jeg ANER ikke hvilken ID de controls har eller får der hvor jeg opretter dem. Hvis jeg sætter Control.ID, så får jeg en ID der har allE Parent.ID'ere med og .clientID er blot NULL..
Kan jeg ikke helt og holdent bestemme hvilken ID jeg vil give det enkelte element, eller kan jeg gøre noget andet, så jeg med sikkerhed kan finde dem fra javascript?
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Jeg har brug for ID, for at vide hvilket element der blev klikket på, og det fanger jeg i Request.Form - der leder jeg efter den Control.ID som jeg selv tildelte, og som er en bestanddel af ClientID.
Du kunne måske bruge en tilsvarende taktik på klienten: finde de pågældende elementer vha. document.getElementsByTagName og blandt disse finde dem hvor den pågældende del af ClientID stemmer overens med din ControlID?
Alternativt kan man kigge på hvordan ClientID er komponeret af elementets ID og alle ParentID og "hardkode" dette. Ej vildt elegant, men en virkende ad hoc løsning:) (som jeg selv ikke er ret glad for, men som jeg bruger fordi det var det eneste der virkede i en anden sammenhæng).
Mmmmtjaaah. Jooooh. Måske har jeg en pænere løsning. Ved udu om kan kan læse ClientId på et eller andet sted i server-koden.. Jeg er så ked at at lægge server-kode i mine .ASPX filer..
Ok.. Mit forsøg virker. JKeg gør det, at jeg serverside opretter en public HashTable med de ID'er og selve Control'en jeg ønsker at tilgå fra javascript.
I min .ASPX fil tilgår jeg dem så på følgende måde :
<!-- <% foreach (object o in controlList.Keys){ Control ctrl = (Control)controlList[o]; Response.Write(o.ToString() + ",\"" + ctrl.ClientID.ToString() +"\""); Response.Write("<br>"); } %>
Det er heller ikke ret flot, men jeg undgår at lave tunge sammenligninger i JavaScript delen.
Hvis BARE jeg kunne få fat på den der ClientID server-side så kunne jeg registerer det med this.Page.RegisterStartupScript hvilket jo absolut ville give bedre kode.. -->
Jeg har bladret febrilsk i docs, og kan ikke helt se nogen beskrivelse for HVORNÅR ClientID faktisk får en værdi. Så vidt jeg forstår, så tildeler du selv et ID, men får intet tilbage i ClientID.
Jeg kunne forestille mig, at det stensikre tidspunkt på hvilket kontrollen pinedød SKAL have et clientID er i PreRender - det er jo det sidste trin inden det hele sendes til klienten. Så kunne man arbejde sig baglæns i sidens life cycle, og se hvornår de ClientID egentligt bliver oprettet.
Og hvis dette ikke virker, så burde man faktisk selv, i server koden, kunne komponere clientID ved at kigge på control.id for serverkontrollen + control.parent.id + control.parent.parent.id osv, og sammenstykke et ID ud af det, med den korrekte separator (hvad dette separator tegn er, kan man også få ud af kontrollens property)
rækkefølgen har åbenbart en betydning - dvs. at en control skal være tilføjet til sin parent control osv, for at man skal kunne få dennes clientID - og det er jo i og for sig logisk nok.
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.