21. august 2005 - 13:12Der er
68 kommentarer og 2 løsninger
Vise label, textbox, button ?
Hejsa,
Jeg har lavet en formular der viser x antal felter. Jeg har nu behov for at et par af disse felter først bliver synlige når et af de andre felter indeholder et tal <> 0.
Der sker det at jeg popper et vindue hvor jeg klikker på en tekst der retunere et tal til et felt i selve min formular. Alt dette virker ganske fint, men hvorledes løser jeg at de felter der skal være skjulte først vises når det ene felt indeholder et tal ?
Virksomheder er på vej fra store sprogmodeller, der svarer på spørgsmål, til AI-agenter, der kan udføre opgaver på egen hånd. Det gør teknologien mere nyttig – og langt mere risikabel.
Hvis du ikke vil lave postback til serveren for at få vist felterne, så skal du klare det via javascript. Det kunne gøres ved at sætte felterne til display:none som udgangspunkt og så sætte dem til display:block efter dialogen lukker (hvis altså feltet indeholder en værdi der medfører at felterne skal vises)...
Altså jeg popper et vindue der indeholder en liste med nogle links som ved klik på en af dem retunere et tal til et felt og først når dette felt indeholder et tal skal de andre felter være synlige.
Jeg ved ikke om det hjælper lidt på ?
Jeg har prøvet med postback og der bliver felterne synlige så snart jeg popper vinduet og det er ikke optimalt da det jo kan ske at men ved en fejl har poppet vinduet og lukker det ned uden at klikke på et link !?!
Jeg har flg. 2 aspx-sider (hovedsiden med de skjulte kontroller):
<%@ Page language="c#" Codebehind="testShowHiddenFields.aspx.cs" AutoEventWireup="false" Inherits="Sandkassen.Tests.testShowHiddenFields" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
...og popupsiden med links: <%@ Page language="c#" Codebehind="testShowHiddenFieldsPopup.aspx.cs" AutoEventWireup="false" Inherits="Sandkassen.Tests.testShowHiddenFieldsPopup" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
Umiddelbart så virker det efter hensigten :o) Men, men, men når så de felter jeg får vist igen skalfyldes med data fra et andet popup vindue ja så forsvinder felterne jeg lige har fået frem ved første popup og det var jo ikke lige meningen !?!
lyder som om du sætter visible = false i din serverside kode. ... enten skal du lade være med at lave et postback, eller også skal du sørge for at at serverkoden ikke sætte visible = false. mvh
Hvis ja, skal du også på serveren tage stilling til om felterne skal vises eller ej, for det er (forventeligt) her du sætter display:none som udgangspunkt... eller hvoradn fungerer det hos dig?
Hvis man sætter visible til false på serveren bliver kontrollen slet ikke renderet på klienten, dvs. den eksisterer ikke i HTML-koden og kan derfor ikke findes via DHTML... så det tror jeg ikke er problemet...
Jeg synes det er interessant at høre sekvensen af hændelser ifm. åbning af det andet popupvindue, for hvis det sker clientside, så gør du et eller andet som skjuler felterne igen (jeg har dog tendens til at tro det er et postback eller en refresh af siden som driller dig).
Så fik jeg testet med både a href og asp:hyperlink og begger kan jeg få til at virke efter hensigten men jeg får skrevet denne ved brug af asp:hyperlink :
Could not find any attribute 'onclick' of element 'HyperLink'.
Men, det virker alligevel når jeg køre koden hvad skyldes det, er det en fejl i .net platformen ?
nej - det betyder ikke noget. der findes ikke et Click-event (serverside) på et hyperlink, men det er jo også clientside du ønsker at håndtere det. mvh
Jeg håber det er ok med deling af point ellers må i lige brokke jer lidt ;o)
Og det er en ganske fin løsning med javascript da jeg jo som sådan ikke poster noget tilbage tilserveren før jeg gemmer selve indholdet af formularen i databasen, så din er ganske udemærket ;o)
Hvis nu jeg har flere knapper på min side til forskellige felter som åbner samme vindue, men som skal smide et tal i det felt den respektive knap tilhøre hvad gør jeg så med javascriptet ?
Jeg ville umiddelbart parameterisere funktionen setFieldValue på hovedsiden:
<script type="text/javascript"> function setFieldValue(fieldName, fieldsToShow, value) { var txt = document.getElementById(fieldName) txt.value = value; if(txt.value != "0" && txt.value != "") { var flds = fieldsToShow.split(';'); for(var i = 0; i < flds.length; i++) { document.getElementById(flds[i]).style.display = "block"; } } } </script>
og så skal den funktion der åbner vinduet også have en eller anden form for parameter der angiver hvilket felt der skal påvirkes. Det kan f.eks. gøres med en querystring-parameter:
Da det kun er det første felt der er afgørende for om nogle felter skal vises tror jeg ikke helt det er løsningen der hvor jeg mener jeg skal bruge en variabel er i disse linier fra det oprindelige javascript :
Hmmm... hvis jeg forstår dit svar, så kan du stadig bruge den løsning jeg foreslog, idet du bare kan lade være med at specificere nogle felter i show-parameteren. Så kan du jo altid på et senere tidspunkt ændre mening - uden du skal ændre mere på scriptet...
Hmmm... jeg tror du er nød til at vise mig hvad det er for noget kode vi arbejder med i øjeblikket, for jeg kan få mit lokale eksempel til at fungere, men det hjælper jo ikke meget på din løsning ;)
Jeg glemte måske nok oxo lige at sige at jeg med denne løsning ikke skal gemme/vise nogle felter blot have muligheden for at kunne poppe samme vindue fra en formular, men så har jeg da løsninger det hele nu ;o)
Nej, du må endelig ikke lave [i] om til (i) for det er javascript som udføres på klienten, hvor det andet vi ændrede tidligere var serverside og VB.NET.
Det er MEGET vigtigt at adskille disse to opgaver! :)
Prøv evt. at indsætte denne kommando umiddelbart inden fieldsToShow.split
alert("fieldsToShow er: " + fieldsToShow);
Så skulle vi gerne få afklaret hvad der ligger i den variabel. Det kan godt være du lige skal skifte til det bagvedliggende vindue for at se dialogen, for den kommer til hovedvinduet...
Se det er jo spøjst at den siger at den forventer et objekt, når der rent faktisk er et i forvejen...!? Er du heeeeeelt sikker på at linie 38 er denne linie:
hæng lige på !?!?!?!?! Nu viser den fame ikke noget i min view source længere selvom det godt nok synligt i min kode så skal jeg have den fikdet før jeg kan poste noget html til dig.
jeg har desvære ikke mulighed for at vise dig noget site da min server ikke er kørende for tiden :o(
Navne var skrevet, men copy/paste bøf på en If...Then sætning gav udslag i at mine felter ikke blev vist så det virker nu.........Jeg beklager ulejligheden :o)
function setOpenerValue(value) { var fieldName = "<%=Convert.ToString(Request.QueryString("field"))%>"; var fieldsToShow = "<%=Convert.ToString(Request.QueryString("show"))%>"; opener.setFieldValue(fieldName, fieldsToShow, value); self.close(); }
kan få sat en session til "". Jeg forestiller mig noget i stil med at det kunne komme ind lige inden jeg laver self.close();, men kan ikke helt få det til at virke min session er skal blot laves således :
Du kan ikke umiddelbart pille ved session på klienten (og det er hvad den kode du viser der er). Så du skal tilbage til serveren og sætte den session-værdi, hvis den skal ændres - og det gør du f.eks. med et postback...
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.