Avatar billede daxiez Nybegynder
10. maj 2006 - 15:54 Der er 14 kommentarer og
1 løsning

over skrive sin cache i c#

Jeg har et array i min cache, men når jeg prøver på at overskrive det sker der intet ? hvordan skal man gøre det ?

ps. er ik på igen før imorgen !
Avatar billede snepnet Nybegynder
10. maj 2006 - 15:56 #1
Kan du vise os koden der er i spil?
Mvh
Avatar billede daxiez Nybegynder
11. maj 2006 - 08:26 #2
Jeps det kan du tro !

// Gem i cache
string[] stringArray;
        stringArray = new string[30];
        stringArray.SetValue(Textbox.Text, 0);
        Cache.Insert("array", stringArray, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, null);


//hent fra cache
string[] stringArrayCache = (string[])Cache.Get("array");

//når jeg så prøver at gemme i cache igen sådan her:

string[] stringArray;
        stringArray = new string[30];
        stringArray.SetValue(Textbox.Text, 0);
        Cache.Insert("array", stringArray, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, null);

//Hvor der er en anden værdi i textboxen overskriver den ikke  ?
Avatar billede snepnet Nybegynder
11. maj 2006 - 08:39 #3
Du skal bare sætte stringArrayCache[0] til den nye værdi

string[] stringArrayCache = (string[])Cache["array"];
stringArrayCache[0] = <ny værdi>;

Du skal ikke begynde at lave et nyt array når du har det i forvejen (hvilket du bør checke for).

Jeg er ikke sikker på hvad du vil frem til, men dit cache objekt er tilgængeligt for alle brugere, så er du sikker på at det er der du vil lægge dine data, som synes at være indtastninger i specifikke textboxe.

Mvh
Avatar billede daxiez Nybegynder
11. maj 2006 - 09:04 #4
Mener du at cache ligger på server ? sådan at alle browsere bruger den samme cache eller hvordan ?
Avatar billede daxiez Nybegynder
11. maj 2006 - 09:06 #5
Det er faktisk kun fordi jeg ikke kunne finde ud af at tilgå min masterpage  fra content pages og skrive data i nogle labels. måske lidt over kill så ?
Avatar billede snepnet Nybegynder
11. maj 2006 - 09:12 #6
Ja - det er en cache på serveren du skriver til der.
Hvis det er brugerafhængigt, kan du benytte Session istedet.

I din codebehind til en form kan du få fat i din master sådan her:
this.Master;

Hvis du vil have fat i din specifikke master, og vi siger at du har kald den SpecialMaster, kan du gøre sådan her:

SpecialMaster master = this.Master as SpecialMaster;
if(master != null)
{
  // gør noget med din master
}

Den måde du bør kode mod din master, er via public properties og methods - så sådan nogle skal du lave på den... Så kan du f.eks.

SpecialMaster master = this.Master as SpecialMaster;
if(master != null)
{
  master.SpecialSubHeader = "Blahblah";
}

SpecialSubHeader er så en public property på masteren.

Du kan undgå at skulle typecaste this.Master til din egen type ved at indsætte en mastertype directive på din form.

<%@ MasterType VirtualPath="url_til_din_master>" %>

Mvh
Avatar billede daxiez Nybegynder
11. maj 2006 - 09:38 #7
ok jeg prøver med nogle properties..

Fx.
//på masterpagen
public string Hoejde
    {
        get
        {
            return Hoejde;   
        }
        set
        {
            Hoejde = value;   
        }
    }

// på content page

MasterPage MP = (MasterPage)this.Master;
         
        if (MP != null)
        {
            MP.Hoejde = txthoejde.Text;
        }

GIver denne fejl :
System.StackOverflowException
Avatar billede snepnet Nybegynder
11. maj 2006 - 09:47 #8
Det ville være en god idé hvis du giver din masterpage et andet navn end MasterPage, da det kan skabe lidt forvirring da den generelle master også hedder MasterPage.
Din stackoverflowexception kommer fordi du returnerer propertien fra din property, så det vil bare fortsætte indtil din exception falder:

public string Hoejde
    {
        get
        {
            return Hoejde; // her skal du returnere en medlemsvariabel istedet   
        }
        set
        {
            Hoejde = value; // her skal du sætte din medlemsvariabel   
        }
    }

F.eks.
private int m_Hoejde;

public int Hoejde
    {
        get
        {
            return m_Hoejde;   
        }
        set
        {
            m_Hoejde = value;   
        }
    }

Mvh
Avatar billede daxiez Nybegynder
11. maj 2006 - 10:20 #9
Har lavet sådan her nu i min masterpage:

public class trappe
{
    private string Hoejde_t;
    private string diameter_t;

    public string Hoejde
    {


        get
        {
            return Hoejde_t;
        }
        set
        {
            Hoejde_t = value;
        }

    }

    public string diameter
    {
        get
        {
            return diameter_t;
        }
        set
        {
            diameter_t = value;
        }
    }
}

// er det så ikke sådan her jeg sætter en værdi ind ?

trappe tr = new trappe();
       
        if (tr != null)
        {
            tr.Hoejde = txthoejde.Text;
        }

// og sådan her jeg henter en værdi ?

trappe tr = new trappe();

        if (tr != null)
        {
            try
            {
                txthoejde.Text = tr.Hoejde;
            }
            catch { }
           
        }

Synes ikke der sker en "'*"@
Avatar billede snepnet Nybegynder
11. maj 2006 - 10:34 #10
Hvis du har klasser der skal være en del af applikation, synes jeg du skal lægge dem i App_Code folderen. Der kan den ses af alle forms.
Hvad mener du med at der ikke sker noget. Hvad regner du med at der skal ske?
Man kan ikke sige at du henter noget i den kode du har skrevet til sidst.
Du instantierer en ny trappe og spørger hvad højden er - men den vil jo bare have en defaultværdi som vil være null da du benytter en string.
Du må holde på de objekter du instantierer, hvis du vil bruge dem flere steder fra.

Hvis din masterpage skal holde styr på en trappe - kan du jo have en trappe-property på den, og så arbejde på den fra dine sider.

// i din masterpage
private trappe m_Trappen;

public trappe Trappen
{
  get
  {
    if(m_Trappen == null)
    {
      m_Trappen = new trappe();
    }
  }
  set
  {
    m_Trappen = value;
  }
}

Så kan du skrive imod den fra dine forms:

SpecialMaster master = this.Master as SpecialMaster;
if(master != null)
{
  master.Trappen.hoejde = "blah";
}

Men jeg er ikke helt sikker på det er den rigtige løsning... Kan du ikke forklare hvad du gerne vil have til at ske?

Mvh
Avatar billede daxiez Nybegynder
11. maj 2006 - 11:22 #11
Jeg vil gerne lave det sådan at jeg instantierer en ny trappe fra app_code folderen og kan tilgå det samme instans af denne class i alle mine forms !
Avatar billede snepnet Nybegynder
11. maj 2006 - 11:34 #12
Så lægger du bare filen med koden i App_Code, og hvis det skal være samme instans du tilgår fra alle forms, kan du enten benytte Cache/Application objecterne til at gemme instansen i, eller benytte dig af en static variabel.
Jeg synes du bør lave det som en singleton, og at du bør kigge på denne artikel arne har skrevet om emnet:
http://www.eksperten.dk/artikler/37
Mvh
Avatar billede daxiez Nybegynder
11. maj 2006 - 12:32 #13
Har fulgt artiklen ! super nice !
har nu denne kode:

//app_code
public class trappe
{
       
        private static trappe instance = null;        
        private string Hoejde_t;
        private string diameter_t;
        private string retning_t;
 
    // private constructor   
    private trappe()
    {
           
          // skal der være noget her ????
    }
   
    public static trappe GetInstance()
    {
        if (instance == null)
        { instance = new trappe(); }
        return instance;
    }


    public void sethoejde(string hoejde)
    { Hoejde_t = hoejde; }   
   
    public string Gethoejde()
    { return Hoejde_t; }
   
   
 
}

// Her der ud over en kanp

protected void Button1_Click(object sender, EventArgs e)
    {
        // set den indtastede værdi
        trappe tr = trappe.GetInstance();
        tr.sethoejde(txthoejde.Text);

        Response.Redirect("side2.aspx");
       
       
    }

// hvilket virker, men trykker jeg tilbage står der intet i textboxen selvom der i pageload er denne kode:

trappe tr = trappe.GetInstance();
        try { txthoejde.Text = tr.Gethoejde(); }
        catch { }

Er der noget galt i den måde jeg gør det på ? måske min constructor ?
Avatar billede daxiez Nybegynder
11. maj 2006 - 13:14 #14
Det virker sku fint .... skulle bare drikke noget kaffe og trykke igen.... Du skal have mange tak for hjælpen ! Kæmpe hjælp, jeg takker.... smid et svar !
Avatar billede snepnet Nybegynder
11. maj 2006 - 13:19 #15
Det var bestemt så lidt :o)
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