Avatar billede Slettet bruger
10. august 2006 - 09:01 Der er 10 kommentarer og
1 løsning

Dynamisk genererede kontroller og events

Hejsa.

Jeg har et lidt "mærkeligt" problem, der går ud på at jeg i min kode opretter en liste med autogenererede linkbuttons og også et par knapper, der hver får tildelt en eventhandler-metode.

I starten ville mine linkbuttons ikke reagere ordentligt når man klikkede på dem - altså, de kaldte ikke den event-metode de skulle, men efter at have lavet et kald fra Page_Load til den metode, hvor linkbuttons bliver oprettet virker dette fint.

Problemet er så, at de autogenererede knapper nu har samme problem. Man skal simpelthen klikke to gange på dem før der sker noget.

Knapperne udfører henholdsvis en redirect til en bestillingsside og en funktion, der tømmer en ordreliste fra session.

Men det virker som sagt ikke efter hensigten.

Det virker dog hvis man kalder siden igen, uden refresh, så man kan se ordrelisten. Men ikke hvis det er indenfor samme "page cycle" - altså indenfor postback.

Nogen der ved noget om dette?
P.S. Relevant kode kan postes hvis dette kan give et bedre indtryk af opbygningen af siden.
Avatar billede trumf Nybegynder
10. august 2006 - 09:52 #1
Kan du ikke tilføje noget javascript der reloader siden ?

knap.Attrubutes.Add("onclick", "java script:AspnetForm.submit()");

eller noget i den stil...
Avatar billede trumf Nybegynder
10. august 2006 - 09:54 #2
knap.Attrubutes.Add("onclick", "java script:document.aspnetForm.submit()");
Avatar billede Slettet bruger
10. august 2006 - 10:35 #3
Hejsa.

Tak for dit råd, men jeg vil nu helst undgå for meget javascript :-)
I forvejen er det lige før, at javascriptet fra gridview og mine linkbuttons er for meget og her overvejes alternative løsninger, sådan at brugerne ikke skal være tvunget til at enable javascript.

Men tilbage til sagen.

Har det ikke noget med den cyklus som siden gennemgår, der er problemet?
Det virker jo fint nok, hvis siden reloades uden at blive opdateret, men hvis der er tale om et postback udføres event-metoden bare ikke.

Kan man gøre noget her, fx. fra Page_Load, hvor man eventuelt laver en validering af hvor kaldet blev sendt fra eller lignende?
Avatar billede mrbonus Novice
10. august 2006 - 12:56 #4
Når du laver dynamiske kontroller, putter events på dem skal du kende til udførelsen af en ASP.NET side,

når den er blevet lavet og sendt til brugeren i html, så forsvinder "alt" (alt dynamisk du har i din kode) fra serverens hukommelse. Det vil sige at du ved hvert postback skal oprette dine eventhandlere.

Jeg har prøvet at beskrive det med lidt kode og kommentarer

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'at oprette controls og events here, vil virke,
        'for så bliver de oprette hver gang

        If Not Me.IsPostBack Then
            'at oprette controller og events her er forkert,
            'for kun ved første kald til serveren bliver de bygget
            'ved næste kald til serveren, bliver de ikke bygget, og der sker derfor ikke noget
        End If
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        'at oprette controller og events her er forkert,
        'for ved næste kald til serveren, bliver de ikke bygget, og der sker derfor ikke noget
    End Sub
Avatar billede Slettet bruger
10. august 2006 - 13:57 #5
Ok. Nu har du så fortalt mig hvordan jeg ikke skal gøre. Endda i VB.NET, selvom forummet er et C# forum :-)

Kan du så ikke fortælle mig hvordan jeg rent faktisk gør det rigtigt?
Avatar billede mrbonus Novice
10. august 2006 - 18:23 #6
Ups jeg overså C#, men jeg skrev også hvordan du skulle gøre det, de første kommentarer, sagde at de skulle ligge her(i "page load"), men skriver det lige i C# også


        private void Page_Load(object sender, System.EventArgs e)
        {
            //at oprette controls og events here, vil virke,
            //for så bliver de oprette hver gang

            If (!Me.IsPostBack)
            {
                //at oprette controller og events her er forkert,
                //for kun ved første kald til serveren bliver de bygget
                //ved næste kald til serveren, bliver de ikke bygget, og der sker derfor ikke noget
            }
        }
        private void Button2_Click(object sender, System.EventArgs e)
        {
            //at oprette controller og events her er forkert,
            //for ved næste kald til serveren, bliver de ikke bygget, og der sker derfor ikke noget
        }
Avatar billede trumf Nybegynder
10. august 2006 - 20:06 #7
Når der er lavet et eventwireup på siden vil der automatisk generes javascript (eller JScript) det klarer .NET helt selv, så scriptsprog kommer du ikke udenom, med mindre du vil give afkald på en masse af de smarte metoder i .NET

Jeg er ikke helt sikker på at jeg forstår dit problem, men har du prøvet at sætte autopostback på de kontroller du generer bagved ?
Avatar billede Slettet bruger
11. august 2006 - 08:35 #8
Mit problem er, at de autogenererede knapper i den metode, der kaldes hver gang siden loader ikke fyrer deres event-metoder af.

Det sjove er, at det virker hvis der kun tilføjes én enkelt vare til ordrelisten, men hvis der tilføjes flere (siden postes tilbage mere end én gang), så virker det bare ikke.

Jeg har forsøgt at oprette lige præcis de to knapper og deres event-handlers i Page_Load, men det giver samme problem.

Der må da være tænkt på sådanne problemer i .NET?
Er der ikke muligheder for at afvikle noget if... i Page_Load for at verificere, hvor/hvem der laver postback-kaldet til serveren og dermed afvikle nogle kald ud fra det?
Avatar billede mrbonus Novice
11. august 2006 - 08:47 #9
Du bliver nødt til at teste om de varer"controls" og deres events oprettes både når du ber om det, og ved næste postback, det lyder som om de ikke bliver oprettet ved dit postback, så lav et debug punkt og prøv at se hvad der sker
Avatar billede Slettet bruger
11. august 2006 - 09:08 #10
Hejsa. Ved ikke lige hvordan jeg laver et debug-punkt, men jeg har fundet en løsning på mit problem lige nu og her.
Det er selvfølgelig altid ærgeligt at man ikke kan lave tingene på den måde man gerne vil, men jeg har lavet noget andet der ser ud til at virke.

Alle varerne lægges stadig i en autogenereret tabel i en metode, der kaldes ved hvert Page_Load og disse varer får også tilknyttet en dynamisk genereret event-handler. Det virker som det hele tiden har gjort, da denne metode jo kaldes ved hvert Page_Load.

Jeg har så i min .aspx-side oprettet en tabel til bestillings-knapperne - "ryd vbareliste" og "bestil varer", denne tabel er sat til visible=false og vises kun når indkøbskurven indeholder mindst én vare. Denne tabel tilknyttes såp samtidig en placeholder under den autogenererede tabel.

Og det virker :-)
Tak for jeres input!
Avatar billede trumf Nybegynder
11. august 2006 - 12:25 #11
Godt det virker, men burde mrbonus ikke have haft point ?
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