Avatar billede torotune Nybegynder
16. september 2005 - 08:44 Der er 26 kommentarer og
1 løsning

Refresh-problem i UserControl

Hej.

Jeg har en aspx-side med en UserControl på.
I min UserControl er der en liste hvorfra jeg kan vælge en værdi. Udfra den værdi bliver der skabt en Cookie, som i samme øjeblik skal bruges i scriptet på selve min aspx-side.

Problemet er, at det virker fint, men at min aspx-side hele tiden er en cookie (fra min liste) bagud. Når jeg klikker i min liste skabes cookie'en, men min aspx-side bruger den cookie som var valgt sidst - altså der mangler en slags 'refresh' i det script i min UserControl, som opretter cookie'en udfra min valgte værdi.

Hvordan slipper jeg nemmest omkring det? :-)
Avatar billede thanse21 Nybegynder
16. september 2005 - 10:09 #1
Du bliver nødt til at gennemtvinge et postback på din aspx-side.
Avatar billede torotune Nybegynder
16. september 2005 - 10:14 #2
Hvordan kan jeg gøre det i Page_Load() ?
Avatar billede thanse21 Nybegynder
16. september 2005 - 10:17 #3
Du må oprette en reference til din aspx-side i din ascx-fil.

Eventuelt med en statisk metode på din aspx-side som du kalder gennem ascx-filens parent
Avatar billede torotune Nybegynder
16. september 2005 - 10:26 #4
Jeg forstår ikke helt, kan du give et lille eksempel? :-)
Avatar billede snepnet Nybegynder
19. september 2005 - 15:59 #5
brug sådan en model her:

// page_load i aspx'en
if(!IsPostBack)
{
  DoCookieDependantStuff();
}

void DoCookieDependantStuff()
{
  // hvad der nu skal ske afhængigt af din cookie
}

i din usercontrol sørger du så for, at hæve et event når brugeren gør noget der ændrer cookien, hvilket du så kan samle op på selve din form:

someUserControl.CookieChanged += new EventHandler(someUserControl_CookieChanged);

og...
protected void someUserControl_CookieChanged(object sender, EventArgs e)
{
  DoCookieDependantStuff();
}

du må spørge hvis der er noget du er i tvivl om, men som udgangspunkt kører din page_load altid før din eventhandlers, så at have kode i page_load der er afhængig af det der sker i en eventhandler er noget skidt.
enten vil du være forsinket et roundtrip - eller også vil du komme til at køre de samme ting flere gange.

mvh
Avatar billede torotune Nybegynder
20. september 2005 - 11:58 #6
Hej Snepnet!

Jeg er næsten med :-) Jeg har denne kode i min UserControl der ændrer cookien:

    Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs)
           
        Dim LanCookie As New HttpCookie("FlLanguage")
        LanCookie.Value = DrpLanguage.SelectedItem.Value
        LanCookie.Expires = dt.Add(ts)
        Response.Cookies.Add(LanCookie)

    End Sub

Hvordan hæver jeg det event med:

someUserControl.CookieChanged += new EventHandler(someUserControl_CookieChanged);

Hvad er somUserControl mere præcist i mit tilfælde?

M.v.h
Avatar billede snepnet Nybegynder
20. september 2005 - 12:09 #7
someUserCotrol er bare den du har, og får at få hævet kan du bruge følgende model:

// definér et event på din klasse:
public event EventHandler CookieChanged;

// implementer en metode der kan hæve det
protected virtual void OnCookieChanged(EventArgs e)
{
  if(CookieChanged!=null)
    CookieChanged(this, e);
}

// og - i den metode du har vist kan du så bare
OnCookieChanged(EventArgs.Empty);

så kan du hooke op på det event fra din form som vist med:
someUserControl.CookieChanged += new EventHandler(someUserControl_CookieChanged);

ovenstående er den anbefalede model, og den kan du fører videre, hvis du f.eks. ønsker at benytte et specielt argument ol.
f.eks. kan du lave et argument som du kan trykke de oplysninger på, som du på nuværende tidspunkt lægger i cookien - så kan du jo muligvis droppe den (cookien).


mvh
Avatar billede torotune Nybegynder
20. september 2005 - 13:22 #8
Hmm.. okay, jeg har altså nu

I min UserControl:

    Event CookieChanged As EventHandler
 
    Protected Overridable Sub OnCookieChanged(ByVal e As EventArgs)
        If Not (CookieChanged Is Nothing) Then
            CookieChanged(Me, e)
        End If
    End Sub

    Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs)
           
        Dim LanCookie As New HttpCookie("FlLanguage")
        LanCookie.Value = DrpLanguage.SelectedItem.Value
        LanCookie.Expires = dt.Add(ts)
        Response.Cookies.Add(LanCookie)
        OnCookieChanged(EventArgs.Empty)     
    End Sub

I min aspx-side, skal jeg så have

  someUserControl.CookieChanged += new EventHandler(someUserControl_CookieChanged)

ind i min page_load() og er someUserControl = det jeg har stående i TagName'et for min UserControl?

Sorry hvis jeg er helt væk, men er ikke helt familiær med begreberne endnu (metode, hooke up, event og argument) :-)
Avatar billede snepnet Nybegynder
20. september 2005 - 13:27 #9
bare helt iorden :o)

someUserControl skal være dit id på den usercontrol du har på din side. hvis det giver dig en compilerfejl, skal du deklerere den withevents i din klasse.
(jeg er ikke helt klar over hvordan miljøet opfører sig når man arbejder med vb).
... måske har du allerede din kontrol i rullegardinerne når du er i din codebehind, og du kan se der vælge eventet.

mvh
Avatar billede torotune Nybegynder
21. september 2005 - 12:12 #10
Hej igen, ja den kunne ikke genkende min UserControl, så jeg har nu deklareret den  i min klasse, sådan at koden i min klasse ser således ud:

    Public Language As Control = Page.LoadControl("/myControls/language.ascx")
    Public Event CookieChanged As EventHandler

    Public Sub Language_CookieChanged(ByVal sender As Object, ByVal e As EventArgs)
        GetLanguage()
    End Sub

I min UserControl Language.aspx bliver cookien dannet, og jeg opretter (forhåbentligt) et event med:

    Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs)           
        Dim LanCookie As New HttpCookie("FlLanguage")
        LanCookie.Value = DrpLanguage.SelectedItem.Value
        LanCookie.Expires = dt.Add(ts)
        Response.Cookies.Add(LanCookie)
        AddHandler Language.CookieChanged, AddressOf Language_CookieChanged   
    End Sub

- Som starter Sub Language CookieChanged() oppe i min klasse.

OG i min aspx har jeg:

    Sub Page_Load(ByVal Source As Object, ByVal E As EventArgs)
        If Not IsPostBack Then
            GetLanguage()
        End If
    End Sub
   
    Sub GetLanguage()

    '*** Hvad der nu skal ske afhængigt af min cookie   
   
    End Sub

- Men, jeg får nu fejlen "Name 'GetLanguage' is not declared." i min aspx.
Hvorfor bliver GetLanguage i min aspx ikke kørt her?

Jeg smider lige nogle flere points for besværet :-)
Avatar billede snepnet Nybegynder
21. september 2005 - 12:16 #11
hej igen :o)

Du skal bare deklerere den som den type den er, så denne linie:

Public Language As Control = Page.LoadControl("/myControls/language.ascx")

Skal modificeres så du udskifter Control med typen på din UserControl (klassens navn).

Når det er gjort - skulle du gerne kunne lave denne:
AddHandler Language.CookieChanged, AddressOf Language_CookieChanged

Mvh
Avatar billede torotune Nybegynder
21. september 2005 - 12:38 #12
Den melder ikke nogen ændringer når jeg gør dette, men det ser ud som at den får eventet fint igennem. Problemet er at den så når hertil i min klasse:

Public Sub Language_CookieChanged(ByVal sender As Object, ByVal e As EventArgs)
        GetLanguage()
End Sub

- Hvor den så ikke genkender og kører GetLanguage() som jo findes i min aspx.
Avatar billede snepnet Nybegynder
21. september 2005 - 12:48 #13
hey hov - lige et øjeblik.... der er noget der er galt:

hvis det her er i din usercontrol:

Public Sub ChangeLan(ByVal sender As Object, ByVal e As System.EventArgs)           
        Dim LanCookie As New HttpCookie("FlLanguage")
        LanCookie.Value = DrpLanguage.SelectedItem.Value
        LanCookie.Expires = dt.Add(ts)
        Response.Cookies.Add(LanCookie)
End Sub

skal du sørge for at hæve eventet derfra, så denne:
AddHandler Language.CookieChanged, AddressOf Language_CookieChanged   

skal udskiftes med denne:
OnCookieChanged(EventArgs.Empty);

i din code-behind til din form, skal du så
AddHandler Language.CookieChanged, AddressOf Language_CookieChanged

og have metoden Language_CookieChanged implementeret, hvor du så uden problemer skulle kunne kalde GetLanguage()

Sorry - tror jeg misforstod noget af det du skrev tidligere... Gik nok lidt for stærkt.

mvh
Avatar billede torotune Nybegynder
21. september 2005 - 13:30 #14
Yes, jeg tænkte nok jeg havde rodet rundt i det..

I'm almost there:

Hvor og hvordan implementerer jeg "AddHandler Language.CookieChanged, AddressOf Language_CookieChanged" ?
Avatar billede snepnet Nybegynder
21. september 2005 - 13:38 #15
det er så der du skal sørge for at opdatere det der skal opdateres iht. det der nu er foregået i din usercontrol.
mvh
Avatar billede torotune Nybegynder
26. september 2005 - 14:45 #16
Hej igen,

Jeg har bøvlet lidt med det, men har lige lidt svært ved at få det til at virke, selvom det nok er mere simpelt end jeg tror:

Denne skal implementeres i min aspx:

  AddHandler Language.CookieChanged, AddressOf Language_CookieChanged

Men i en sub/void?

- Og denne i min userControl, language.ascx:

OnCookieChanged(EventArgs.Empty)

Hvordan deklarerer jeg "OnCookieChanged", for den kommer med en
Name 'OnCookieChanged' is not declared.

mvh
Avatar billede snepnet Nybegynder
26. september 2005 - 17:23 #17
OnCookieChanged er bare metode i din usercontrol der blot kan hæve eventet, hvis der er nogle abbonnenter - som du selv postede på et tidspunkt.

    Protected Overridable Sub OnCookieChanged(ByVal e As EventArgs)
        If Not (CookieChanged Is Nothing) Then
            CookieChanged(Me, e)
        End If
    End Sub

mvh
Avatar billede torotune Nybegynder
27. september 2005 - 15:17 #18
Det ser ud til at jeg fint får hævet eventet nu fra min control, og jeg kan hooke det op i page_load() på min aspx, med

"AddHandler Language.CookieChanged, AddressOf Language_CookieChanged"

Men det bliver ikke loadet i runtime - Er stadig en enkelt opdatering forsinket.
Er jeg ude i noget page_init her?
Avatar billede snepnet Nybegynder
28. september 2005 - 06:33 #19
hvad gør du i den her Language_CookieChanged?
mvh
Avatar billede torotune Nybegynder
28. september 2005 - 08:21 #20
Jeg har ændret den lidt, så den hedder
"AddHandler Language.EventChangeLan, AddressOf getLanguage", men den gør det samme.

getLanguage er en sub på min Aspx der henter tekst udfra en database, udfra hvilken cookie der er dannet fra en dropdown i min Ascx:

Public Sub getLanguage(sender As Object, e As System.EventArgs)             
       
StrSQL = "SELECT Text from Page WHERE TextID = '" & Request.Cookies("FlLanguage").Value & "';"

  '** Udfør data

End Sub
Avatar billede snepnet Nybegynder
28. september 2005 - 16:32 #21
hvad gør du så det data du henter?
(du må undskylde de lidt underligere responstider, men her er klokken 07:30 nu)
mvh
Avatar billede torotune Nybegynder
29. september 2005 - 12:23 #22
I orden, jeg er også ved at være en bug med det her spørgsmål, men det er lige en afgørende detalje for at jeg kan komme videre med mit projekt.

Men de data/den tekst jeg henter, smider jeg ud i nogle labels. Som du nok har regnet ud, så leger jeg med at site hvor brugeren vælger et sprog i UserControl'en, skaber en cookie, og alt tekst-indholdet på Aspx-siden bestemmes så udfra cookiens værdi.
Avatar billede torotune Nybegynder
04. oktober 2005 - 12:28 #23
Hej igen, jeg ved ikke men jeg tror at det eneste jeg har som problem nu, er at få min aspx's klasse "Webform.vb" til at snakke sammen med min UserControl's klasse "UserControl.vb"

Nu bliver min UserControl "language.ascx" nemlig fundet nede i min aspx, hvor den har ID=UserLan.

Så kommer meddelelsen:

" The base class includes the field 'UserLan', but its type (FormClass) is not compatible with the type of control (ASP.language_ascx). "

Mine to klasser har disse navne:

Webform.vb:
Public class Formclass : Inherits Page
Public UserLan As Formclass = Page.LoadControl("/Ascx/language.ascx")
  ' anden kode
End Class

UserControl.vb:
Public UserClass Class : Inherits UserControl
' anden kode
End Class

Jeg har prøvet at ændre declarationen af min UserControl, i WebForm.vb til:

  Public class Formclass : Inherits Page
    Public UserLan As UserClass = Page.LoadControl("/Ascx/language.ascx")
      ' anden kode
  End Class

Men her kommer der så en fejl med at UserClass ikke er defined.
Avatar billede torotune Nybegynder
04. oktober 2005 - 12:32 #24
Rettelse:

UserControl.vb:
Public Class UserClass : Inherits UserControl
' anden kode
End Class

:-)
Avatar billede torotune Nybegynder
05. oktober 2005 - 11:57 #25
Hej, det blev noget rod, så jeg må se at komme videre med projektet :-)

Jeg tror jeg løser problemet ved at lave en refresh af siden når cookien er dannet. -På den måde slipper jeg omkring forsinkelsen, da jeg ikke kan få hooket up på eventet i samme round trip som det dannes i UserControl'en.

Men du skal have mange tak for din hjælp, som helt sikkert er points værdig, så smid endelig et svar :-)
Avatar billede snepnet Nybegynder
06. oktober 2005 - 23:04 #26
hej torotune ... undskyld jeg ikke har kunnet skrive herude. jeg er tilbage igen nu, men på lidt lavt blus den næste uges tid eller to :o(
mvh
Avatar billede torotune Nybegynder
08. oktober 2005 - 13:40 #27
Ok - helt i orden, jeg takker for hjælpen denne gang! :-)
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