Autor Beitrag
Vegeto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 06.09.12 14:56 
Hallo...

Also wie schon als Überschrift geschrieben, ich habe probleme dabei, das List<int> Objekt zu speichern, sodass ich bei neustart der Anwendung, diese XML Datei Laden kann.

Mein code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
string output = speicher_Ort + txt1.Text + ".csv";
            StreamWriter streamWriter = new StreamWriter(@output, false);
            List<int> ids = new List<int>();
            for (int r = 0; r < dataGridView1.Rows.Count; r++)
            {
                if (Convert.ToBoolean((dataGridView1.Rows[r].Cells["Speichern"as DataGridViewCheckBoxCell).Value))
                {
                    string rowValue = "";
                    for (int c = 1; c < dataGridView1.ColumnCount; c++)
                    {
                        rowValue += "\"" + dataGridView1.Rows[r].Cells[c].Value + "\";";
                    }
                    streamWriter.WriteLine(rowValue);

                    ids.Add(Convert.ToInt32(dataGridView1[1, r].Value));  
 
                    //das habe ich von hier im forum, doch irgendwie verstehe ich dass nciht und speichert auch nichts ab :(
                    XmlWriterSettings xws = new XmlWriterSettings();
                    xws.Indent = true;
                    xws.IndentChars = "  ";
                    XmlWriter xw = XmlWriter.Create("ids.xml", xws);
                    XmlSerializer xs = new XmlSerializer(typeof());
                    xs.Serialize(xw, test);
                    xw.Close();

Das ist mein Code für Button Speichern,er hat zwei funktionen.
Zum einen gibt er die (ausgewählten)Zeilen in einer .csv-Datei wieder.
Und zum anderen speichert er die ID's der schon verwendeten Datensätze in ein List<int>.

Nun möchte ich das er den Inhalt in art von xml abspeichert und bei Neustart der Anwendung soll er die XML datei auslesen. und ein list<int> füllen, denn ich möchte dann diese Liste verwenden für vergleiche etc.

Von hier habe ich den Code:
www.entwickler-ecke....d+laden_64947,0.html

Ich hoffe ihr könnt mir weiterhelfen, der Thearder hat mir leider nicht weiter geholfen :(

LG
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 06.09.12 15:38 
Zitat:
XmlSerializer xs = new XmlSerializer(typeof());


Du musst dem XmlSerializer den Typ mitgeben den du serialisieren willst. Du musst also zwischen die Klammern hinter typeof noch genau den Typ schreiben den du serialisieren willst

Zitat:
xs.Serialize(xw, test);


test sollte dann die Instanz sein die du serialisieren willst. Die von dem Typ ist die du dem Konstruktor des XmlSerializer übergeben hast.


Der von dir verlinkte Beitrag ist eigentlich ziemlich gut und vollständig. Woran scheitert es denn zu verstehen? Vielleicht lässt sich der verbessern.

Für diesen Beitrag haben gedankt: Vegeto
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 06.09.12 16:13 
COOL Danke...

Doch jz gibt er mir beim kompiler diesen Fehler an:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
XmlWriterSettings xws = new XmlWriterSettings();
xws.Indent = true;
xws.IndentChars = "";
XmlWriter xw = XmlWriter.Create("ids.xml", xws);
XmlSerializer xs = new XmlSerializer(typeof(int));
xs.Serialize(xw, ids); // hier kommt der Fehler: Beim Generieren des XML-Dokuments ist ein Fehler aufgetreten.
xw.Close(); ´


wo ist der fehler bitte -.-

lg
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 06.09.12 16:27 
Überleg nochmal was willst du Serialisieren? Einen int?
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 06.09.12 16:28 
Nein eine List <int> soll gespeichert werden.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 06.09.12 16:31 
Also. Was schließt du daraus was du in den typeof() schreiben musst?

Für diesen Beitrag haben gedankt: Vegeto
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Do 06.09.12 16:35 
:oops: soory :oops:

doch wo speichert er jz die xml datei ab?

den möchte sie natürlich auch auslesen lassen :)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 06.09.12 16:47 
Da wo du dem XmlWriter gesagt hast das er es hinschreiben soll. Da du dem Kind nur einen Namen aber keinen Pfad mitgegeben hast nimmt er denn aktuellen Ordner. Das ist erst mal wenn du denn nicht verstellt hast der Ordner in dem auch deine Anwendung liegt. Das ist unglücklich da Programme ja üblicherweise im Programme Ordner liegen, wie unerwartet bei dem Ordnernamen ;), und ein normaler User da keine Schreibrechte hat. Du solltest dir schon genau überlegen wo du deine programmabhängigen Daten ablegst.

Hilfreich dabei wären zum Beispiel die ~SpecialFolder~ von Windows. Über Environment.GetFolderPath kannst du die üblichen verdächtigen ermitteln wo du deine Daten ablegen kannst. Also Folder bei der Methode wäre zum Beipiel eine der ApplicationData Konstanten ein üblicher Kandidat. Ansonsten einen SaveFileDialog einbauen.
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Fr 07.09.12 08:21 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

Das ist erst mal wenn du denn nicht verstellt hast der Ordner in dem auch deine Anwendung liegt. Das ist unglücklich da Programme ja üblicherweise im Programme Ordner liegen, wie unerwartet bei dem Ordnernamen ;), und ein normaler User da keine Schreibrechte hat. Du solltest dir schon genau überlegen wo du deine programmabhängigen Daten ablegst.


Wieso ist das den Unglücklich? Ist doch ganz einfach unter bin\debug\ids.xml...?


user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

Hilfreich dabei wären zum Beispiel die ~SpecialFolder~ von Windows. Über Environment.GetFolderPath kannst du die üblichen verdächtigen ermitteln wo du deine Daten ablegen kannst. Also Folder bei der Methode wäre zum Beipiel eine der ApplicationData Konstanten ein üblicher Kandidat. Ansonsten einen SaveFileDialog einbauen.


Ahh Okay also sollte ich diesen special folger nehmen: "C:\WINNT\System32" weil dort jeder zugreifen kann und weil das Speichern und lesen ein geben und nehmen ist, weil sie ja ständig verändert wird ? (:

Und wenn ich diese XML Datei lesen will benötige ich den Streamreader? Kann ich mit dem auch vergleiche aufstellen(z.B. gebe ich den reader an einem DataTable und der soll diese ID's und deren dazugehöre Zeile löschen)?

Ich hoffe du verstehst was ich meine, ich weiß nämlich nicht wie ich per Streamreader, den xml inhalt in ein List<int> schreiben kann :/
Lg
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 07.09.12 10:40 
Zitat:
Wieso ist das den Unglücklich? Ist doch ganz einfach unter bin\debug\ids.xml...?


Und es darf natürlich niemals nie woanders liegen :roll:

Zitat:
"C:\WINNT\System32"


Und der Windows Ordner liegt natürlich auch immer da und nie woanders :roll:

System32 ist so ziemlich der letzte Ort in den du rumschreiben solltest. Ich sprach schon von den ApplicationData Foldern. Also Ordner unterhalb des Benutzerordners. Wenn du was benutzerabhängiges machst könnte es z.B. SpecialFolder.ApplicationData sein wenn es gemeinsam für alle User sein soll dann eher SpecialFolder.CommonApplicationData. Auf einen Standard (Deutschen) Win7 würdest du die Daten dann in C:\Benutzer\<UserName>\AppData\Local zu finden sein.

Zitat:
Und wenn ich diese XML Datei lesen will benötige ich den Streamreader?

Zitat:
Ich hoffe du verstehst was ich meine, ich weiß nämlich nicht wie ich per Streamreader, den xml inhalt in ein List<int> schreiben kann :/


Ja. So wie in dem von dir verlinkten Beitrag beschrieben. Ersetze halt auch da in den Beispielen den MyClass Platzhalter durch List<int>.

Zitat:
Kann ich mit dem auch vergleiche aufstellen(z.B. gebe ich den reader an einem DataTable und der soll diese ID's und deren dazugehöre Zeile löschen)?


Der StreamReader holt dir den Inhalt einer Datei als Stream in den Speicher mehr nicht. Ich sehe da keinerlei Beziehung zu DataTables. Die Interpretation des Inhalts des Streams und den Abgleich mit der DataTable ist deine Aufgabe.
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Fr 07.09.12 12:54 
Vielen Dank für deinen ausführlichen Comment (:

Ich mach mich ran (: :wink: 8)


ERLEDIGT... ALLES SUPER PALETTI^^