Avatar billede dennism Nybegynder
04. december 2008 - 22:40 Der er 13 kommentarer og
1 løsning

C#: Gem settings?

Jeg har et program med Settings. Jeg vil gerne have, at disse settings bliver gemt, når man lukker programmet - og bliver hentet når programmet åbner igen. Hvordan klarer man nemmest det? De ligger pt. i en static class.
Avatar billede kalp Novice
04. december 2008 - 22:44 #1
IsolatedStorage eller via. en app.config
Avatar billede dennism Nybegynder
04. december 2008 - 22:47 #2
Nu bruger jeg WPF, så har en fil der hedder "App.xaml". Kan jeg ligge dem derind?
Avatar billede kalp Novice
04. december 2008 - 23:09 #3
Nej.. jeg tror ikke App.xaml er det samme som App.Config.
men du koder C#.. hvilket vil sige du kan benytte IsolatedStorage.. selv om du bruger WPF
Avatar billede dennism Nybegynder
04. december 2008 - 23:33 #4
Kan man bruge IsolatedStorage til at gemme en klasses-data? Umiddelbart kan jeg kun finde eksempler hvor der gemmes text.
Avatar billede kalp Novice
04. december 2008 - 23:48 #5
yep det kan du. Text er mange ting.
Du kan gemme din klasse som XML og XML er teknisk set bare text.
Derfor vil det sagtens kunne bruges;)
Avatar billede dennism Nybegynder
05. december 2008 - 00:07 #6
Ok, kan du linke til en guide eller lignende?
Avatar billede kalp Novice
05. december 2008 - 00:07 #7
til hvad? IsolatedStorage eller XML ?
Avatar billede kalp Novice
05. december 2008 - 00:12 #8
Det kræver ikke rigtig en guide det der IsolatedStorage.. her er et eksempel.

IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForAssembly();
            IsolatedStorageFileStream isolatedStream = new IsolatedStorageFileStream(@"app.Settings", FileMode.OpenOrCreate);
            StreamWriter writer = new StreamWriter(isolatedStream);
            writer.Write("HER DIN XML SERIALISEREDE KLASSE");
            writer.Close();

nu er den gemt.

og udlæsning gøres:

      IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForAssembly();
            IsolatedStorageFileStream isolatedStream = new IsolatedStorageFileStream(@"app.Settings", FileMode.Open);
            StreamReader reader = new StreamReader(isolatedStream);
            //gendan din object her.. xml er i reader.
            reader.Close();
Avatar billede kalp Novice
05. december 2008 - 00:22 #9
Her er et fuldt eksempel jeg lige har lavet.
1. Du skal ændre typeof(int) til at være typeof(dinklasse)
2. Du skal sikre dig at din klasse er public og at den har en tom konstruktør.

Det burde vidst være det.

XmlSerializer serialize = new XmlSerializer(typeof(int));
        MemoryStream stream = new MemoryStream();
        serialize.Serialize(stream, 45654);

        string settings = Encoding.UTF8.GetString(stream.ToArray());

        IsolatedStorageFile isolatedStorageFile = IsolatedStorageFile.GetUserStoreForAssembly();
        IsolatedStorageFileStream isolatedStream = new IsolatedStorageFileStream(@"app.Settings", FileMode.OpenOrCreate);
        StreamWriter writer = new StreamWriter(isolatedStream);
        writer.Write(settings);
        writer.Close();
     
        isolatedStream = new IsolatedStorageFileStream(@"app.Settings", FileMode.Open);
        StreamReader reader = new StreamReader(isolatedStream);
        int back = (int)serialize.Deserialize(reader);
        reader.Close();
Avatar billede Slettet bruger
05. december 2008 - 10:12 #10
Det her er absolut den nemmeste, hurtigste og mest skalerbare måde at gøre det på:



public static T Load(string XMLPath)
        {
            //Load settings and return our type

            T temp;

            XmlSerializer DeSerializer = new XmlSerializer(typeof(T));
            TextReader reader = new StreamReader(XMLPath);
            temp = (T)DeSerializer.Deserialize(reader);
            reader.Close();

            return temp;
        }

        public static void Save(string XMLPath, T settings)
        {
            //Save settings to xml using our type

            XmlSerializer serializer = new XmlSerializer(typeof(T));
            TextWriter writer = new StreamWriter(XMLPath);
            serializer.Serialize(writer, settings);
            writer.Close();
        }

Her er en rar fil med et test projekt du kan se på. Så bliver det ikke mere simpelt.

http://www.gratisupload.dk/download/18951/
Avatar billede Slettet bruger
05. december 2008 - 10:14 #11
Du laver en klasse. Lægger nogle fields ind du vil gemme. Kalder Save med en sti, f.eks. C:\Test.xml og så din klasse om settings argument. Kig evt. på eksemplet. Så gemmer den det hele som en xml fil og loader det ind som din egen klasse igen med Load.
Avatar billede kalp Novice
05. december 2008 - 11:30 #12
Hvad er forkellen? at du gemmer til disk?

Jeg synes stadig IsolatedStorage er smartere end at skrive til disken.
Desuden så vil det virke for alle brugere og man slipper helt for, at tænke på skriverettigheder til harddisken.

Er det typeof(T) delen i den kode du mener er "skalerbart" så kan den til overføres til IsolatedStorage eksempelt og det vil stadig være bedre end at skrive til harddisken.
Men det er slet ikke det fokus er på, men hvorledes man nemmest kan gemme og hente settings.

Det er kun hvis det skal køre på systemer hvor IsolatedStorage slet ikke er muligt at skrive til harddisken ville være bedre.
Avatar billede dennism Nybegynder
08. december 2008 - 23:07 #13
Kan jeg få et svar Kalp?
Det endte med at jeg gemte mine setting under Properties.
Avatar billede kalp Novice
08. december 2008 - 23:43 #14
=)
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