Avatar billede mosquito Nybegynder
24. marts 2006 - 15:04 Der er 14 kommentarer og
2 løsninger

null reference - select list i usercontrol og javascript

Jeg sidder med en web usercontrol 'register.ascx' som jeg loader dynamisk ind i 'registerTime.aspx' usercontrol'en indeholder en select liste 'editableList' i en form 'frmName'. Listen har et par clientside functions som den får fra et script 'describtions.js'

Mit problem er at jeg ikke kan fange control'en

Jeg er novice i javascript og håber der er lidt hjælp at hente.

jeg har forsøgt følgende

function fnDescribtionChanged()
{
  var result;
  result =  document.frmName.editableList.options.selectedIndex;
  alert(result);
}

men kigger jeg på document.forms[].length, får jeg værdien '1', nemlig formen fra 'registerTime.aspx', men jeg har ingen idé om hvordan jeg fat i den loadede form 'frmName' og derfra listen i min usercontrol!

Findes der en løsning.. eller rettere hvordan løser jeg min problemet?
Avatar billede snepnet Nybegynder
24. marts 2006 - 15:11 #1
kan du ikke lave en
document.getElementById('id på kontrollen du vil have fat i');
mvh
Avatar billede superdude Nybegynder
24. marts 2006 - 15:13 #2
Og husk at tjekke ID'et efter at din page er blever rendered (Vis Kilde...).

Hvis du bruger usercontrols eller master pages er id'et på en control ikke nødvendigvis den samme som du satte den til...
Avatar billede mosquito Nybegynder
24. marts 2006 - 15:15 #3
nope, den returnerer 'null'
Avatar billede superdude Nybegynder
24. marts 2006 - 15:18 #4
Har du tjekket i din "vis kilde" at formen på klienten rent faktisk har id="frmName"...?
Avatar billede mosquito Nybegynder
24. marts 2006 - 15:18 #5
yeaa... så kører det.. takker. Men kan man altid regne med at den værdi som vises i kildekoden er konstant?

result =  document.getElementById('ctl03_editableList').options.selectedIndex;

det fungerer;-)
Avatar billede superdude Nybegynder
24. marts 2006 - 15:25 #6
Det har jeg også selv funderet over.

Jeg gør det at jeg har lavet en "getElementByIdFragment()" funktion, og påtager dermed selv ansvaret for at holde styr på mine ID'er.

Ikke nogen pæn fremgangsmåde, men jeg havde samme spm som dig - er det genererede ID konstant?

Måske nogle kloge hoveder kan svare på dette?
Avatar billede snepnet Nybegynder
24. marts 2006 - 15:33 #7
well.. i praksis vil du godt kunne regne med det, men de kunne jo ændre den måde id's genereres på som de har lyst til.
desuden kan det ændres hvis du begynder at flytte rundt på kontrollerne.

hvis du skal bruge det i klientkoden bør du hente det... det er tilgængeligt på
someControl.CliendID - så du kan få fat i det hvor du vil.

f.eks. kan du sætte sådan en her ind i dit script:
<%= someControl.ClientID; %>

mvh
Avatar billede mosquito Nybegynder
24. marts 2006 - 15:36 #8
ja, ved getElementByIdFragment(), som funktionens navn antyder, er du ikke sikret at din control er unique. Nummereres de i den orden de renderes på siden, er man jo heller ikke sikker på at den altid hedder det samme.

--> superdude: smid et svar, jeg har fået fat i elementet, resten må jeg se om ikke jeg selv kan løse ;-)
Avatar billede mosquito Nybegynder
24. marts 2006 - 15:39 #9
--> superdude: må vist hellere dele point med snepnet

--> snepnet: smid svar, det lyder interessant med dit forslag, det skal prøves.
Avatar billede superdude Nybegynder
24. marts 2006 - 15:47 #10
Svar

Snepnet -> Ja, men er ClientID ikke kun en get - man kan ikke sette den, vel?

I så fald kan man jo have et javascript liggende i en seperat .js fil der er afhængigt af et bestemt id... Med mindre du via IO åbner jes filen og retter, men det er vist lidt overkill ;-)
Avatar billede mosquito Nybegynder
24. marts 2006 - 15:48 #11
--> snepnet: hvordan får jeg fat i ClientID, når 'someControl' kan være forskellig?

ex. hedder elementet på nuværende 'ctl03_editableList' og hvis den loades tidligere, får den måske id'et 'ctl02_editableList'
Avatar billede superdude Nybegynder
24. marts 2006 - 15:48 #12
"I så fald kan man jo have et javascript liggende i en seperat .js fil..."

Jeg mente:

"I så fald kan man jo IKKE have et javascript liggende i en seperat .js fil.."
Avatar billede snepnet Nybegynder
24. marts 2006 - 16:04 #13
someControl kan ikke være forskellig... det er det id du selv tildeler den.
hvis du har en kontrol hvor du har givet den et id sådan her (bare for eksemplets skyld):

<asp:TextBox id="txtInd" runat="server" />

så vil du - selvom id'et renderes anderledes til browseren - få fat i den fra koden sådan her:

TextBox tb = FindControl("txtInd") as TextBox;

nej - det kan være lidt vanskelidt at hardcode den slags i scriptfiler, men du kan jo så udforme dine scripts, så id'et overføres som parameter ol.

mvh
Avatar billede mosquito Nybegynder
24. marts 2006 - 16:23 #14
--> snepnet: control'en er en <Select> jeg har oprettet i html koden. Findes der en tilsvarende funktion til at finde et elementet i javascript? Det hele sker nemlig clientside.
Avatar billede snepnet Nybegynder
24. marts 2006 - 16:52 #15
nøh... det er ikke ngoet jeg er bekendt med (du mener en smart måde at finde elementerne på ikke)?
mvh
Avatar billede mosquito Nybegynder
24. marts 2006 - 17:16 #16
ja, jeg forventede egentlig ikke at ens id'er skiftede navn, på grund af renderingen... men sådan er det åbenbart, når man loader en control dynamisk. Det var nu også mere af nysgerrighed. Men nu er jeg opmærksom på det.
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