Avatar billede swamboo Seniormester
01. januar 2008 - 17:31 Der er 20 kommentarer og
1 løsning

Gemme data på PDA!!

Hejsa.
Jeg har kikket lidt på nogle forslag (bla. på eksperten) om hvordan man gemmer data via savefiledialog. Men Jeg kan ikke få det til at virke efter hensigten.

Jeg har forsøgt at få denne stump til at virke:
        private void button1_Click(object sender, System.EventArgs e)
        {
            // Displays a SaveFileDialog so the user can save the file
            // assigned to Button2.
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "Text filer|*.txt";
            saveFileDialog1.Title = "Vælg en tekst fil";
            saveFileDialog1.ShowDialog();

            // If the file name is not an empty string open it for saving.
            if(saveFileDialog1.FileName != "")
            {
                // Saves the Image via a FileStream created by the OpenFile method.
                System.IO.FileStream fs =
                    (System.IO.FileStream)saveFileDialog1.OpenFile();

                StreamWriter st = new StreamWriter(fs);
                foreach(object o in this.listBox1.Items)
                {
                    st.WriteLine(o.ToString());
                }
                st.Close();


                fs.Close();
            }

Men (jeg ved ikke om det er fordi det er til en PDA) den brokker sig over flere ting:
1) Den kender ikke ordet Title i linien:saveFileDialog1.Title = "Vælg en tekst fil";
2) Den kender ikke Openfile i linien:(System.IO.FileStream)saveFileDialog1.OpenFile();
3) Den kender ikke komandoen Streamwriter i linien:StreamWriter st = new StreamWriter(fs);

Jeg ved ikke om der er en helt anden måde at gøre det på, men det er samme forslag jeg får via MSDN libery og på nettet.

Jeg ser frem til at høre fra jer...

På forhånd tak!
Avatar billede nielle Nybegynder
01. januar 2008 - 20:10 #1
Ad 1) Korrekt, SaveFileDialog har ikke en Title-property i Compact Framework.

Ad 2) Den har heller ikke metoden OpenFile().

Ad 3) StreamWriter er indeholdt i CF, men måske mangler du en "using System.IO", eller måske bruger du constructor som ikke er tilgængelig i CF.

Anyways, prøv med denne kode.

        private void button1_Click(object sender, EventArgs e)
        {
            // Displays a SaveFileDialog so the user can save the file
            // assigned to Button2.
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "Text filer|*.txt";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                using (StreamWriter st = new StreamWriter(saveFileDialog1.FileName))
                {
                    st.WriteLine(o.ToString());
                }
            }
        }

Du skal ikke tjekke på saveFileDialog1.FileName men derimod på resultatet af ShowDialog() for ellesr får du altid savet også selv om brugeren fortryder.
Avatar billede swamboo Seniormester
01. januar 2008 - 23:54 #2
Perfekt - det kalder jeg klasse!!! Det virkede 1. gang!!!

Men tør man nasse lidt på din viden?

Jeg har læst at man for at indlæse igen skal skrive:
            OpenFileDialog Openfiledialog = new OpenFileDialog();
            Openfiledialog.InitialDirectory = @"c:\";
            Openfiledialog.Filter = "textfiler|*.txt";
            Openfiledialog.FilterIndex = 2;
            if (fdlg.ShowDialog() == DialogResult.OK)
            {
               
            }
Men der mangler en vigtig line her - hvordan fisker man teksten igen? (lad os antage at der i txt-filen bare står "Yeps det virker")

PS! Læg et svar - du har allerede fortjent dine point! Hvis du syntes ovenstående hører til et nyt spørgsmål, så er det helt OK.
Avatar billede swamboo Seniormester
02. januar 2008 - 00:11 #3
hehe - jeg har fået følgende til at virke:
            OpenFileDialog Openfiledialog = new OpenFileDialog();
            Openfiledialog.InitialDirectory = @"c:\";
            Openfiledialog.Filter = "textfiler|*.txt";
            Openfiledialog.FilterIndex = 2;
            if (Openfiledialog.ShowDialog() == DialogResult.OK)
            {
                using (StreamReader st = new StreamReader(Openfiledialog.FileName))
                {
                    Txt_save.Text = st.ReadToEnd();
                }
            }

Er det rigtigt??

Og! Er der en måde at gemme og hente på UDEN at den giver gemme/hente valg? Jeg tænker på en form for cookies og lign.
Avatar billede thesurfer Nybegynder
02. januar 2008 - 00:27 #4
Jeg ved ikke helt hvad du mener med:

"Og! Er der en måde at gemme og hente på UDEN at den giver gemme/hente valg? Jeg tænker på en form for cookies og lign."

Men du kan jo bare indsætte sti og filnavn i parameteret til "new StreamReader"..

Altså, i stedet for "Openfiledialog.FileName"..
Avatar billede thesurfer Nybegynder
02. januar 2008 - 00:29 #5
Med andre ord:

                using (StreamReader st = new StreamReader(@"c:\filnavn.txt"))
                {
                    Txt_save.Text = st.ReadToEnd();
                }

Du bør nok først checke om filen faktisk eksisterer..

Normalt gør man sådan her:

FileInfo fi = new FileInfo(@"c:\filnavn.txt");
if (fi.exists)
{
// filen eksisterer, gør noget..
}

Jeg mener at det er ".exists" .. det er muligvis med stort "E", dvs: "fi.Exists"..
Avatar billede nielle Nybegynder
02. januar 2008 - 08:46 #6
0a) Pas på med at kalde din dialog for "Openfiledialog" - det bliver alt for nemt at forveksle den med klassen "OpenFileDialog".

Jeg kan bedre lide noget i stil med den første navngivning du havde brugt:

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

men den minder selvfølgeligt lidt for meget af drag'n'drop programmering hvor det jo er default-navnet for en sådan dialog.

Alternativer:

OpenFileDialog openFileDialog = new OpenFileDialog();
OpenFileDialog openDialog = new OpenFileDialog();
OpenFileDialog ofd = new OpenFileDialog();

Det anbefales under alle omstændigheder at variable i C# navngives med lille startbogstav ("camel-notation").

http://en.wikipedia.org/wiki/CamelCase
http://msdn2.microsoft.com/en-us/library/xzf533w0(vs.71).aspx


0b) Jeg vil også råde dig til at bruge en konsistent navngivnings notation. F.eks. har du valgt et navn for din TextBox som ikke stemmer overens med den måde de andre variable er navngivet på.

Noget med "txtSave" ville være bedre. Men hvorfor egentlig kalde den for "...Save" - skal den kun bruges til at vise det der blev save't? Eller har den ikke et mere generelt formål end det?


1) En PDA har ikke noget C-drev, og derfor er det ikke rigtigt med:

Openfiledialog.InitialDirectory = @"c:\";

Du skal bruge stier efter dette princip:

\My Documents\filnavn.txt - I PDA'ens indbyggede hukommelse, i biblioteket "My Documents".
\SD Card\dir1\dir2\filnavn.txt - På PDA'ens SD kort
\CF Card\dir1\dir2\filnavn.txt - På PDA'ens CF kort.


2) Da du kun her ét filter i din save-doialog - nemlig "*.txt" - har denne linje ingen som helst effekt:

Openfiledialog.FilterIndex = 2;


3) Hvis du skal arbejde med den samme fil igen og igen, skal du gemme filnavnet på en eller anden måde. Den normale fremgangsmåde er at gemme det i en variabel.

Du har dog et alternativ; Hvis du i stedet for at oprette din OpenFileDialog i de metoder hvor du bruger den, kan du jo i stedet placere den på selve formen. På den måde er den tilgængelig overalt i den form. Dermed har du også ad gang til FileName propertien. Jeg ved dog ikke om jeg helt vil anbefale dette som værende pæn kode.

4) Prøv stedet at kigge på dene kode:

        private void button1_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.Filter = "Text filer|*.txt";

            if (saveDialog.ShowDialog() == DialogResult.OK)
            {
                fileName = saveDialog.FileName;

                using (StreamWriter sw = new StreamWriter(fileName))
                {
                    sw.WriteLine(o.ToString());
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog openDialog = new OpenFileDialog();
            openDialog.Filter = "Text filer|*.txt";

            if (openDialog.ShowDialog() == DialogResult.OK)
            {
                fileName = openDialog.FileName;

                using (StreamReader sr = new StreamReader(fileName))
                {
                    txtSave.Text = sr.ReadToEnd();
                }
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (fileName != null && fileName != "" && File.Exists(fileName))
            {
                using (StreamReader sr = new StreamReader(fileName))
                {
                    txtSave.Text = sr.ReadToEnd();
                }
            }
        }
Avatar billede swamboo Seniormester
02. januar 2008 - 22:38 #7
Hej igen Nielle.

Først tak for dit UTROLIGT udførlige svar - det var meget flot og lærerigt!!! Rigtig godt!!!

Den der textbox savetext.text var kun en midlertidig box, da jeg normalt prøver at bruge betegnende  navne til paneler og boxe mm.
Men du har nogle gode pointer som jeg vil prøve at brug fremover!

Med hensyn til at angive \My document\filnavn.txt i en streng variabel, så har jeg et problem. jeg trode man kunne skrive det direkte, men den vil slet ikke finde sig i "\" - skal man kalde det via en asci, eller...??
Da jeg nuppede stien fra Savefile virkede button3 helt perfekt!

Jeg går ud fra at man uden videre kan lave den samme finktion med streamwriter også - hvis man altså kunne fortælle den stien med "\".

Det jeg skal gemme er nogle priser. Derfor er min drøm at den gemmer og loader uden at man skal tage stilling til det.

Men da det er første gang at jeg prøver at gemme og loade, har din hjælp til nu været meget meget lærerig.

Endnu engang mange tak for din hjælp. (husk svar)
Avatar billede thesurfer Nybegynder
02. januar 2008 - 22:47 #8
Tegnet \ er et escape tegn, og skal dobles for at få en enkelt "\".. ellers skal der bruges @..

Eksempel:

"\\My Documents\\filnavn.txt"

eller

@"\My Documents\filnavn.txt"
Avatar billede thesurfer Nybegynder
02. januar 2008 - 22:52 #9
Jeg kan ikke se "fileName" defineret som en global variabel, eller navnet på et objekt.. så al koden fra punkt 4 i 02/01-2008 08:46:54 vil fejle..
Avatar billede swamboo Seniormester
02. januar 2008 - 23:10 #10
Hej thesurfer.

Jeg læste mellem linierne at værdien af fileName skulle være adressen på filens placering, og så virker det perfekt!

Nå ja - det med @ vidste jeg faktisk godt - det har jeg jo skrevet i 1/1-08 23:54 - jeg er vist træt i dag...
Avatar billede swamboo Seniormester
02. januar 2008 - 23:15 #11
Hvorfor vil den ikke finde sig i at man gemmer sin fil EtEllerAndet.txt?
Den siger - når man prøver at åbne den igen - at den ikke har et "trustet certificate". Skal man gemme via en savefiledialog første gang, eller kan man selv "lave" et sådan certifikat??

Jeg prøvede med følgende kode (Det er en test kode - så den er nok lidt rodet)
            fileName = Txt_save_adress.Text;
            if (fileName != null && fileName != "" /*&& File.Exists(fileName)*/)
            {
                using (StreamWriter sr = new StreamWriter(fileName))
                {
                    sr.Write(Txt_save.Text);
                }
            }
        }

Når man gemmer i eksisterende fil, virker det perfekt!!
Avatar billede thesurfer Nybegynder
02. januar 2008 - 23:32 #12
Så vidt jeg kan huske, er der bestemte områder på PDA'en man ikke kan gemme i..

Hvor prøver du på at gemme henne (det der står i fileName) ?
Avatar billede swamboo Seniormester
02. januar 2008 - 23:39 #13
I: \My Documents\
Avatar billede swamboo Seniormester
02. januar 2008 - 23:47 #14
Men hov!!
Problemet er skam ikke at gemme. Jeg kan godt oprette en fil, men PDA'en nægter at bruge den pga det omtalte certifikat-problem. Jeg kan også godt se den i File Explorer, men den er ikke assignet noget program. Ændrer jeg fil-navnet i File Explorer, og skriver f.eks. det samme igen, så virker den, og jeg kan læse den fra programmet.
Avatar billede thesurfer Nybegynder
03. januar 2008 - 00:03 #15
Fisk :-)
(ingen anelse)
Avatar billede swamboo Seniormester
03. januar 2008 - 12:16 #16
Nielle - jeg savner stadig et svar, så jeg kan sende dig nogen velfortjente point!!!
Avatar billede nielle Nybegynder
03. januar 2008 - 18:47 #17
Jeg kan ikke umiddelbart reproducere dine problemer med manglende certifikat, og jeg kan i hvert fald sgtens gemme i \My Documents\filNavn.txt

Du skriver at filen ikke er assignet noget program. Kan detskyldes at du har glemt at give den en .txt extension?
Avatar billede swamboo Seniormester
03. januar 2008 - 21:58 #18
Du skal bestemt ikke undskylde - du har hjulpet mig fantastisk meget allerede!
Men jeg vil tjekke den detalje - det kan jo være du har ret. Kikker på det lidt senere.
Avatar billede swamboo Seniormester
03. januar 2008 - 22:47 #19
OK - så er jeg ved den rigtige PC.
Jeg kan fornemme at den gemmer filen som hejsa.txt.(ingenting)
kikker jeg på en alm. txt fil bliver typen kaldt (genkendt som) tekstdokument, men den program-oprettede bliver den bare kaldt for file. Så det må være i den retning jeg skal lede. Men tak for deltagelsen, og de mange værdifulde kommentarer!!!!
Avatar billede thesurfer Nybegynder
03. januar 2008 - 22:53 #20
Prøv evt at "udskrive" fileName.. f.eks. med en messagebox eller ligende..
Avatar billede thesurfer Nybegynder
03. januar 2008 - 22:53 #21
..når du gemmer.. :-)
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