Avatar billede henrik_40 Nybegynder
23. juli 2007 - 12:05 Der er 18 kommentarer og
1 løsning

Variabel initialiserer uønsket

public string Text {

    get { return (string)ViewState["Text"]; }

    set { ViewState["Text"] = value; }

}



Hej
Jeg vil gerne lave en tæller (variablen pageID), som skal tælle en op hvergang der bliver trykket på en knap / link. Desværre initialiserer siden sig hvergang så variablen forbliver uændret :-(


Uddrag af kode (tælleren er pageID):

index.aspx.cs
...............

public partial class videnominvestering_artikelarkiv_index : System.Web.UI.Page
{
    public int articleID, pageID = 0;



    public void Updatelinks(Object sender, EventArgs e)
    {

       
        dateFrom = DateTime.Now.AddDays(pageID * -120);
        dateTo = DateTime.Now.AddDays((pageID + 1) * -120);

        ArticleTableAdapter selectArticleAdapter = new ArticleTableAdapter();
        Articles.DataSource = selectArticleAdapter.GetDataBetweenDates(dateFrom, dateTo);
        Articles.DataBind();


        pageID++;
        Response.Write("updatelinksfunktionene  ");
        Response.Write(pageID);
    }



}


index.aspx
------------
                <asp:LinkButton ID="LinkButton1" runat="server" OnClick="Updatelinks">Ældre</asp:LinkButton>


Kan nogen hjælpe mig med at få tælleren til at virke?

/henrik
Avatar billede erikjacobsen Ekspert
23. juli 2007 - 13:08 #1
Ting der skal gemmes fra side til side kan du putte i en sessions-variabel
Avatar billede henrik_40 Nybegynder
23. juli 2007 - 13:39 #2
Det er jo samme side, som bliver indlæst flere gange. Forstår ikke helt hvad du mener.
Avatar billede erikjacobsen Ekspert
23. juli 2007 - 14:50 #3
For webserveren er det en ny side hver gang. Derfor kan du fx gemme værdier i sessions-variabler mellem siderne.
Avatar billede neoman Novice
23. juli 2007 - 15:17 #4
Systemet er "fire-and-forget", så det er lige meget om det er den samme side eller en anden side. Svarer til, hver gang, at du tænder din computer, laver et eller andet, og slukker. Kun hvis du eksplicit har gemt noget, så overlever det til næste gang.

Nu tilbyder frameworket en "work-around" når man poster tilbage til samme side, i og med at der er en "viewstate" : kontrollernes data bliver smidt ind i html'en og sendt til kilenten, og læst derfra ved postback til samme side. Derfor ser det ud som om at systemet "husker" ting. Men almindelige dødelige "variable" skal du selv huske - f.eks. i viewstate (så kan de retrieves men kun ved postback til samme side) eller i session, så kan de "overføres" fra side til side.
Avatar billede henrik_40 Nybegynder
23. juli 2007 - 15:23 #5
Jeg tror nok jeg forstår teorien af hvad I siger.
Neoman, vil du ikke vise mig en sådan viewstate-ting?
Avatar billede neoman Novice
23. juli 2007 - 15:32 #6
Nu snakker jeg VB, så må du selv lave C#

Dim myCounter as Integer

' i page load:
if not page.ispostback then
  'her er vi på siden første gang, så initialiserer og gemmer i viewstate
  ' initialisér variablen
  myCounter = 0
  'gem den i viewstate
  ViewState("myCounter") = myCounter
else
  ' få værdien fra viewstate ved postback
  'ctype er VB'sk for casting
  myCounter = Ctype(ViewState("myCounter"), Integer)
  mycounter += 1
  'gem værdien til næste gang
  ViewState("myCounter") = myCounter
end if

hvis du erstatter viewstate med session, så er værdien tilgængelig også fra andre sider for en bruger i samme session, men til gengæld hænger den derude i hukommelsen indtil session dør eller du dræber værdien selv, whichever comes first.
Avatar billede neoman Novice
23. juli 2007 - 18:21 #7
Nå ja - og alt dette her "viewstate" halløj får du sådan set "gratis" hvis du blot laver en textbox med .Visible=False (hvilket gør at den slet ikke renderes til klienten, men dens viewstate gør !) Så kan du lægge værdien for din variabel ind i mytextbox.text ved page load og hente/opdatere den ved alle postbacks. Effekten er den samme.
Avatar billede henrik_40 Nybegynder
23. juli 2007 - 18:59 #8
Jeg er helt lost :-(
Prøver med din textbox, men laver stadig noget galt:

I aspx-filen har jeg lavet en tekstbox, som du skriver:
    <asp:TextBox runat="server" Visible="false" ID="side"></asp:TextBox>

Samt knappen jeg ønsker skal tælle variablen en op.

  <asp:LinkButton ID="LinkButton1" runat="server" OnClick="Updatelinks">Ældre</asp:LinkButton>


I min cs-fil, Code behind-fil:
    protected void Page_Load(object sender, EventArgs e)
    {
        side.Text = "0"; // initialiserer
    }


Updatelinks-funktionen bliver kaldt fra knappen i aspx-filen

  public void Updatelinks(Object sender, EventArgs e)
    {

        int temp = (int.Parse(side.Text) + 1);
        side.Text = temp.ToString();

        Response.Write("updatelinksfunktion  ");
        Response.Write(side.Text);  // bliver ved med at skrive 1!!!!! øv!!
    }

Fatter ikke det skal være så svært....
Avatar billede neoman Novice
23. juli 2007 - 19:06 #9
klart - fordi du sætter den til 0 ved hver load. Få en if-block udenom, til at teste om  Not page.IsPostback - som vist 23/07-2007 15:32:14
Avatar billede henrik_40 Nybegynder
23. juli 2007 - 19:10 #10
juhuu!
mange tak neoman. Læg et svar :-)
Avatar billede neoman Novice
23. juli 2007 - 19:14 #11
Svar. I øvrigt - du er bekendt med debuggeren ? Der kan du følge din kode skridt for skridt, se hvordan rækkefølgen er, og se variablernes værdier. Hvis du ikke kender den, så tryk, i kode vinduet, på den grå vertikale bjælke yderst til venstre i vinduet. Der vil nu være en brun klat - et break point - hvor koden stopper. Der dukker en værktøjslinje op, og i den kan du trykke på Step Over eller Step Into. Step Over tager dig til den neæste linje kode du ser, mens Step Into tager dig også ind i funktionskald osv. Du kan slette en break point mens du kører ved at klikke på den. Du kan køre koden til næste break point eller til enden ved at trykke på continue.
Avatar billede neoman Novice
23. juli 2007 - 19:18 #12
I øvrigt - erikjakobsen bidrog også , så vent lige med at acceptere (selv om, hvis jeg kender ham ret, så vil han nok vægre sig ved points) :-)
Avatar billede henrik_40 Nybegynder
23. juli 2007 - 19:21 #13
jo - jeg kender den godt nok og bruger den også når jeg laver windows-forms. Men det her web-ting er nyt for mig. Men JA tak for tippet, må se at bruge debuggeren.
Avatar billede henrik_40 Nybegynder
23. juli 2007 - 20:20 #14
Forresten har jeg indtil nu debugget ved at skrive variabler og tekst ud på skærmen på denne måde:
Response.Write("test")

Så lidt debugger jeg da ;)
Avatar billede erikjacobsen Ekspert
23. juli 2007 - 20:22 #15
Testudskrifter kalder man sommetider for "selektive dumps" - det lyder bedre ;)

Nej, jeg samler slet, slet ikke på point.

Men skal du ikke også lige have udgaven med Sessions-variabler?
Avatar billede henrik_40 Nybegynder
23. juli 2007 - 20:28 #16
erikjacobsen --> "Men skal du ikke også lige have udgaven med Sessions-variabler?"

Den vil jeg da MEGET gerne have..
Avatar billede neoman Novice
23. juli 2007 - 20:29 #17
Ja - session/viewstate er nyttige til  f.eks. at smide en arraylist ind i, den er jo lidt svær at opbevare i en textbox :) og session/cache til datasets
Avatar billede neoman Novice
23. juli 2007 - 20:30 #18
du kunne tage mit eksempel med viewstate og omskriv det til c# linje for linje og så bør det funke
Avatar billede henrik_40 Nybegynder
24. juli 2007 - 12:31 #19
Tak til jeg begge. I været mig en stor hjælp :-)
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