Avatar billede stephanryer Nybegynder
02. august 2006 - 11:07 Der er 10 kommentarer og
1 løsning

Tricky - Udfør metode før page_load eller alternativ løsning

Jeg har en placeholder indeholdende en række usercontrols. Disse indsættes dynamisk. I min page_load-metode loader jeg derfor alle mine controls og indsætter dem i min placeholder.

Når disse loades, benyttes en session-variabel til at afgøre nogle indstillinger der skal sættes på disse controls.

Når man klikker på en usercontrol, sættes en session-variabel til en ny værdi. Denne værdi skal så de nye indstillinger på mine controls.

Problemet er, at når man trykker på en usercontrol, så bliver click-metoden udført EFTER Page_Load på parent-siden (den side mine controls er på) og man er derfor nød til at klikke igen for at få den ønskede virkning.

Jeg vil prøve at stille problemet grafisk op:

SESSSION-VÆRDI: GAMMEL
- KLIK PÅ USERCONTROL
SESSSION-VÆRDI: GAMMEL
- PAGE_LOAD() UDFØRES (MED GAMMEL SESSION-VÆRDI)
- CLICK_METODE() UDFØRES
SESSSION-VÆRDI: NY

Det jeg gerne ville have skete var noget i stil med:

SESSSION-VÆRDI: GAMMEL
- KLIK PÅ USERCONTROL
SESSSION-VÆRDI: GAMMEL
- CLICK_METODE() UDFØRES
SESSSION-VÆRDI: NY
- PAGE_LOAD() UDFØRES (MED NY SESSION-VÆRDI)



Er der andre metoder end Page_load jeg kan overloade, som først udføres efter hele siden er loaded og evt. click-metoder er udførst? Eller er der en anden løsning på dette problem?

På forhånd tak.

Beklager, men har kun 70 point tilbage :)
Avatar billede dj_uncas Nybegynder
02. august 2006 - 11:26 #1
Du har ret mange metoder at vælge imellem. Du kan f.eks. bruge OnLoadComplete eller OnPreRender...
Avatar billede jokkejensen Novice
02. august 2006 - 11:26 #2
ClickMetode()
{
setsession();
Response.Redirect('Samme side');
}


Altså laver du et redirect til samme side, udføres page_load, kræver dog endnu et roundtrip til serveren.
Avatar billede stephanryer Nybegynder
02. august 2006 - 11:38 #3
dj_uncas: Jeg har fundet en anden løsning, men læg et svar! De metoder der kan jeg sagtens få brug for senere hen :)

jokkejensen: Den løsning kan jeg ikke bruge i mit tilfælde, da jeg bruger MaintainScrollPositionOnPostBack :)
Avatar billede dj_uncas Nybegynder
02. august 2006 - 11:43 #4
Heh, ok. Og ja man kommer lige pludselig til at override en del af metoderne i den famøse "Page Life Cycle" når man kender dem...
Avatar billede stephanryer Nybegynder
02. august 2006 - 11:48 #5
yes :) Hvordan kan det egentlig være at Page_Load ikke skal override en anden metode?
Avatar billede dj_uncas Nybegynder
02. august 2006 - 13:31 #6
Det er fordi du på din .aspx side har noget i stil med:

<%@ Page AutoEventWireUp="true" %>

... hvilket sørger for at hook'e Load eventen på Page op på Page_Load. Ligesom hvis du manuelt gjorde dette:

Page.Load += new EventHander( Page_Load );
Avatar billede stephanryer Nybegynder
02. august 2006 - 13:51 #7
Well det lader til at jeg bliver nød til at benytte dit forslag med at overskrive en af dine metoder. Jeg har prøvet med OnLoadComplete, men det viste sig at metoder ikke blev udført fra dynamisk indsatte usercontrols.

Hvad kan jeg ellers prøve?
Avatar billede snepnet Nybegynder
02. august 2006 - 14:00 #8
Prøv at vis den kode der benytter din sessionvariabel til at generere siden.
Mvh
Avatar billede stephanryer Nybegynder
02. august 2006 - 14:21 #9
Jeg har lavet to simple filer, der beskriver problemet:

http://ryer.dk/stephanryer.zip

test.aspx-filen viser hvilke metoder, der først køres efter variablen er sat.

Det jeg søger er en måde at få user-controllen til først at aflæse session-variablen efter der er loadet. Er der en bestemt metode man kan bruge til dette?
Avatar billede stephanryer Nybegynder
02. august 2006 - 14:21 #10
(Du skal nok få 70 point, når jeg når op på det igen :))
Avatar billede snepnet Nybegynder
02. august 2006 - 15:08 #11
Har du en email så jeg kan sende dig en rarfil?

Du kan få det her indtil videre, men det er jo lidt mere bikset end at få et pakket site.

Nå men anyway... Du vil få mere ud af at gøre den slags eventbaseret - så er det lavet som det er lavet i de medfølgende kontroller:

// kontrollen (ascx):
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="MinKontrol.ascx.cs" Inherits="MinKontrol" %>
<asp:Button ID="btnKnap" Text="Opdatér" runat="server" OnClick="btnKnap_Click" />
Denne control læser tallet:
<asp:TextBox ID="txtTal" runat="server"></asp:TextBox>

// kontrollen (cs):
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class MinKontrol : System.Web.UI.UserControl
{
    public event EventHandler TalOpdateret;

    public int SessionTal
    {
        get
        {
            object o = Session["SessionTal"];
            return o != null ? (int)Session["SessionTal"] : 0;
        }
        set
        {
            Session["SessionTal"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            VisTal();
        }
    }

    protected void VisTal()
    {
        txtTal.Text = (SessionTal == 0 ? "ingenting" : SessionTal.ToString());
    }

    protected virtual void OnTalOpdateret(EventArgs e)
    {
        if (TalOpdateret != null)
        {
            TalOpdateret(this, e);
        }
    }

    protected void btnKnap_Click(object sender, EventArgs e)
    {
        SessionTal = ++this.SessionTal;
        VisTal();
        OnTalOpdateret(EventArgs.Empty);
    }
}


// siden (aspx):
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="LoadTest.aspx.cs" Inherits="NewFolder1_loadtest" %>

<%@ Register Src="MinKontrol.ascx" TagName="MinKontrol" TagPrefix="uc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <uc1:MinKontrol ID="MinKontrol1" runat="server" OnTalOpdateret="MinKontrol_TalOpdateret" />
        <br />
        <uc1:MinKontrol ID="MinKontrol2" runat="server" OnTalOpdateret="MinKontrol_TalOpdateret"/>
        <br />
        <br />
        Sidens aflæste tal: <asp:Label ID="lblTal" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>

// siden (cs):
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class NewFolder1_loadtest : System.Web.UI.Page
{
    public int SessionTal
    {
        get
        {
            object o = Session["SessionTal"];
            return o != null ? (int)Session["SessionTal"] : 0;
        }
        set
        {
            Session["SessionTal"] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            OpdaterTal();
        }
    }

    protected void MinKontrol_TalOpdateret(object sender, EventArgs e)
    {
        OpdaterTal();
    }

    protected void OpdaterTal()
    {
        lblTal.Text = (SessionTal == 0 ? "ingenting" : SessionTal.ToString());
    }
}

Mvh
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