12. juli 2007 - 14:28Der er
17 kommentarer og 1 løsning
Postback med opdateret indhold
Hej
Jeg har et stort problem - håber der er en der kan komme med en løsning...
Jeg har en side med en række imagebuttons der bliver lavet via en repeater - når jeg klikker på en af disse knapper sætter den noget speciel style på knappen , so far so good. Når jeg så gerne vil tilføje en imageknap har jeg lavet et panel som så overlapper på siden hvor man så kan tilføje en ny knap , her gemmer jeg så værdien i min DB og den lukker det panel. det gør den jo i en postback , men problemet er at min liste af elementer (image buttons) ikke bliver opdatetet. Det skal siges at jeg har EnableViewState="true" . Hvis dette er sat til false virker det sådan set udover den så ikke husker hvilken knap jeg havde trykket inden.. Jeg ved godt man kunne løse det ved at gemme et ID i feks querystring - men det andet må da også kunne lade sig gøre
Er dette situationen ?: 1. Du har en repeater (med en knap i hver linje) budnet til noget iDb'en 2. Du har en Insert knap, som sætter en ekstra record ind i DB, når du trykker på den 3. Eftersom repeateren allerede er databundet før Insert-knappens event håndteres, så vises ikke den ekstra linje i repeateren umiddelbart efter tryk på Insert-knappen, men først efter du f.eks. tilføjet endnu en linje ?
Hvornår laver du databinding på repeateren ? kun i PageLoad ? Du kunne rebinde repeateren i din Insert-knaps event handler.
1. min repeater indeholder 1 imagebutton , så der kommer en række med knapper svarede til det antal records i DB der passer til. 2. ja 3. jeg indsætter den nye record på onclick eventen - og nej får aldrig vist den/de ekstra knapper med mindre jeg virkelig reloader siden. ligesom om den gemmer den postback / viewstate med hvordan (hvor mange) knapper der var fra start. men ja databinder repeateren på pageload, men har også prøvet at gøre det både før og efter uden noget resultat..
Det forstår jeg ikke helt. Har du prøvet at lave en databind på din repeater inde i din minInsertButton.Click event handler lige efter at værdierne er lagt ind i Db'en i den selvsamme handler ? Fordi dette skulle jo gerne opdatere repeateren med nyeste data, inden det hele bliver rendered.
1. Din repeater vises i samme postback med korrekt antal rækker efter din Insert, hvor du rebinder i Insert.CLick, og ViewState=False ?
2. Din repeater vises korrekt først i næste postback, hvis du blot ændrer ViewState for repeateren til False ?
Kunne du vise noget kode ? Din page load og din Insert event handler ? (Og det er vel kun de to steder der sker noget med repeateren? Ellers også de andre handlers plz:)
<ItemTemplate> <asp:Button runat="server" ID ="knap" Height="25" Width="22" BorderColor="ActiveBorder" BorderStyle="Solid" BorderWidth="1" OnClick="OnClick_ChooseLevel1" /> </ItemTemplate> </asp:Repeater> -------------------------------- end repeater1_ItemDataBound er ikke så vigtig her.. den sætter bare stylen på den valgte knap
//ThumbnailExists indsætter record hvis den ik allerede ligger der //OnClick_CloseAddColorPattern lukker blot vinduet
og på onload
SQLLevel1.SelectCommand = "select * from ColorPatternTree left join ColorPattern on ColorPatternTree.idcolorpattern = ColorPattern.id where ColorPatternLevel = 1 and IDStyle=" + this.StyleID; SQLLevel1.DataBind();
1. prøv i stedet at rebinde datasourcen til repeateren : repeater1.databind hvis du gør det så bliver datasourcen mig bekendt opdateret. Jeg ved ikke om en databind på en objectdatasource automatisk slår igennem til den kontrol som er bundet til datasourcen. I princippet brude det slet ikke vøre nødvendigteksplicut at rebinde i Onload, i og med at den repeater er dkalrativ i source,n, så det sker af sig selv.
2. jeg ser ikke nogen databind for repeateren i protected void OnClick_SetAsThumbnail(object sender, EventArgs e)
for ellers skal du rigtigt nok vente til næste postback for at se en ændring.
you are the man... :) - det var sgu bare det der manglede ... den taber så godt nok viewState på den selectede knap , men skulle jeg nok kunne løse.. tak for hjælpen smid et svar
Der kan man bare se - jeg anede ikke engang at der var en DataBind metode på en datasource, hehe .) Skulle lieg gogole lidt for at se hva pokker den gør:)
For 200 pts kan du få mig til at svede lidt mere hvis du vil : hvilken knap er det lige som ikke synes at have en viewstate ? Den sidst tilføjede ? hvordan viser det sig ?
Og din forvirring kommer måske ud af page life cycle. Rækkefølgen for ting, når du klikker på en knap er groft sagt følgende:
PageLoad kører (og imens bliver viewstate gift med de kontroller som findes på dette tidspunkt) Handlers bliver kørt (f.eks. din click handler) - så det er her du skal rebinde, hvis du har lavet ændringer og ønsker at se dem i samme hug Render - hele molevitten bliver sendt til klienten
jeg har en onclick event på knapperne der gør at når jeg trykker en af dem , så får den en tykkere border , og når jeg så klikker rundt på knapper i niveau 1 (har 3 niveauer) , så alt efter hvilken knap jeg vælger i niveau 1 kommer der nogle knapper frem i niveau 2 (lidt a la træstruktur med knapper :P ) og dette husker den , altså lad os sige jeg klikker rundt på knapperne nede i niveau 2 , så kan den stadig huske hvad jeg klikkede på i niveau 1. - men vil tro det smarteste er at gemme den nuværede knaps id eller lign i en viewstate og så hente den lige efter jeg har gemt den nye knap - burde det ik gøre det?
"dette husker den" ? Husk lige jeg ikke aner hvad du laver jo, hehe..
Hvordan ser du "husker" og "husker ikke" ?
Husk lige at hvis du laver noget dynamisk, og derpå en postback, så skal de dynamiske elementer være tilstede (eller genskabes) on page load. Hvis man genskaber dem senere, så kan frameworket ganske rigtigt ikke finde de elementer som viewstate skulle giftes med.
altså hvis jeg bare klikker på en knap bliver den markeret som den aktive (siden laver en postback når jeg klikker på knappen) , men hvis jeg så hopper ind og vil oprette en ny knap (stadig samme side i det panel) og så opretter den dør den , altså markeringen.. og det er underligt nok , for har en dropdown-liste i opret hvor den også laver postback hver gang jeg laver et nyt valg i dropdown , har en selectindexchengd på , fordi den herinde viser et lille billede af det aktuelle valg i dropdown´en - men stadig gemmes værdien i knappen i baggrunden kan jeg se.. - kan godt se det nok er lidt kompliceret at sætte sig ind i når du ikke har set det LIVE.. Det der undrer mig er bare at den først taber den aktive knap når jeg opretter.. men okay jeg rebinder jo også repeateren , er det derfor ? - for mener heller ikke det virkede før jeg satte den rebind på..
altid rart når tingene virker :) og jo, det er svært at gennemskue det uden at se det
men så vidt jeg forstår, så har du problemet med at en dropdown ikke husker sin stilling ? Det er rigtigt, en rebind resetter den, men du kunne jo lægge dropdownX.SelectedValue ind i viewstate (dropdownX.SelectedValue=ViewState("myValue"), og fiske den op derfra i din click.handler.. så den sidste linje i den ville vel være (efter databind).. dropdown.selectedvalue=ViewState("myValue") . . og i princippet burde den også typecastes, men den virker nok alligevel med simple ting som numre og strings.
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.