Entwickler-Ecke

WinForms - Textfile aus Treeview erstellen


SSC streezer - Di 10.06.08 16:09
Titel: Textfile aus Treeview erstellen
Hallo Leute,

ich hab ja in meinem Post (http://www.c-sharp-forum.de/topic_Treeview+Textfile+strukturiert+anzeigen_83868.html) das Problem gehabt ein Textfile strukturiert einzulesen - das funzt jetzt Problem los.

jetzt ist mein weiteres Ziel, das File wieder zu speichern, und zwar dass die einzeelnen Zeilen wieder hergestellt werden und es wieder ein Zeilen-für-Zeile txt File wird.

wie kann ich den Treeview einlesen ? muss ich dazu ganz normal einen filestream und reader machen?

denke mal da eignet sich die Tag Eigenschaft sehr gut...

wenn ich folgendes mache:

C#-Quelltext
1:
fileNode.Tag = fileNode;                    

soltle das Tag ja eigentlich den Namen vom FileNode bekommen - tut es aber nicht :s

gruss,
streezer


bakachan - Di 10.06.08 16:27
Titel: Re: Textfile aus Treeview erstellen
user profile iconSSC streezer hat folgendes geschrieben:
wie kann ich den Treeview einlesen ? muss ich dazu ganz normal einen filestream und reader machen?

treeView.Nodes
node.Name / node.Text

so kannst du alle Nodes durcharbeiten (bzw deine Struktur) das kannst du dann jeweils per Textwriter oder Streamwriter in ein TextFile schreiben.


SSC streezer - Mi 11.06.08 08:42

ok hab das jetzt so:

treefile.tag wird oben beim erstellen des treeview instanziert.

jetzt - so wie der code steht - erhält der tag den Wert 989 :s böööö - deshalb hab ich Convert.ToString hingeschrieben und gehofft dass dies das Problem behebt =).. klappt leider nicht...


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:
25:
26:
            FileStream fs = new FileStream(m_path + "/SAVE.txt", FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter m_streamWriter = new StreamWriter(fs);

            if (treeFile.Nodes.Count > 0)
            {
                try
                {
                    m_streamWriter.WriteLine(Convert.ToString(treeFile.Tag));
                }
                catch
                {
                    MessageBox.Show("Ein Fehler ist aufgetreten während des Speicherns. Änderungen nicht gespeichert""", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    MessageBox.Show("Änderungen gespeichert""", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                MessageBox.Show("keine Zeilen vorhanden. Bitte ein File einlesen.""", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            
            m_streamWriter.Flush();
            m_streamWriter.Close();
            fs.Close();


bakachan - Mi 11.06.08 08:58

ich glaube du hast mich missverstanden

Du musst selbst aus den Nodes wieder die Textform machen die du haben willst.
Also quasi so wie du sie eingelesen hast nur umgekehrt.

Du kannst nicht einfach das ganze Objekt in einen Streamwriter schmeissen und hoffen das es die passende Form hat.


Du könntest natürlich beim einlesen schon den treenode in irgendeiner eigenschaft (seis nun name, text oder sonst was) den entsprechenden text zuweisen den es später beim speichern haben soll oder du machst es halt erst beim speichern.


SSC streezer - Mi 11.06.08 10:12

ich versteh nur bahnhof :s *seufz*

mir ist schon klar dass ich die funktion die ich fürs einlesen geschrieben hab einfach umkehren muss... aber was ist das gegenteil von der funktion "split"? diese umdenkung bereitet mir einfach enorme kopfschmerzen...

hier der code der das ganze einliest:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
StreamReader sr = null;
            try
            {
                sr = new StreamReader(filename);
                while (!sr.EndOfStream)
                {
                    string line = sr.ReadLine();
                    List<string> elements = line.Split(".".ToCharArray()).ToList();
                    ParseLineAndInsertNodesInTree(elements, nodes);
                }
            }
            finally
            {
                sr.Close();
            }


bakachan - Mi 11.06.08 10:42

user profile iconSSC streezer hat folgendes geschrieben:
aber was ist das gegenteil von der funktion "split"?

string.Join
oder der Stringbuilder oder sonstige arten um strings zu verketten


SSC streezer - Mi 11.06.08 11:01

bin irgendwie einfach zu dumm :(

das ist ja viel komplizierter als das einlesen :x


C#-Quelltext
1:
2:
3:
4:
5:
6:
while (treeFile.Nodes.Count > 0)
                {
                    string line = sw.WriteLine();
                    List<string> elements = string.Join(".".ToCharArray()).ToList(); 
                    sw.WriteLine(line);
                }


bakachan - Mi 11.06.08 11:10

user profile iconSSC streezer hat folgendes geschrieben:

C#-Quelltext
1:
2:
3:
4:
5:
6:
while (treeFile.Nodes.Count > 0)
                {
                    string line = sw.WriteLine();
                    List<string> elements = string.Join(".".ToCharArray()).ToList(); 
                    sw.WriteLine(line);
                }


ehrlich gesagt erkenne ich in diesem Code-Schnippsel keinen Sinn.
Und wenn du nicht ein bischen darüber nachdenkst wie der string am Ende aussehen soll und woher du die Nötigen Teile dazu bekommst, wirst du es wohl auch nicht hinkriegen.


SSC streezer - Mi 02.07.08 08:23

habs nicht geschafft -.- echt sch..... es gibt kein join bei c# :s


bakachan - Mi 02.07.08 08:43

user profile iconSSC streezer hat folgendes geschrieben:
es gibt kein join bei c#


doch gibt es

C#-Quelltext
1:
2:
string.Join(string separator, string[] value);
string.Join(string separator, string[] value, int startIndex, int count);


Es gibt aber auch Stringbuilder usw.


SSC streezer - Mi 02.07.08 08:59


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
StreamReader sr = null;
                try
                {
                    sr = new StreamReader(filename);
                    while (!sr.EndOfStream)
                    {
                        string line = sr.ReadLine();
                        List<string> elements = line.Split(".".ToCharArray()).ToList();
                        ParseLineAndInsertNodesInTree(elements, nodes);
                    }

                    MessageBox.Show("Änderungen gespeichert""", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }


wenn ja die variable "line" splitte ist das ja das gegenteil - aber wenn ich da z.b. "line.stringbuilder" oder "line.join" machen will, geht das nicht - das attribut hab ich nicht zur verfügung :S


SSC streezer - Mi 02.07.08 09:21

kann es sein dass es so etwas ist:

C#-Quelltext
1:
List<string> elements = string.Concat(line);                    


bakachan - Mi 02.07.08 09:41

user profile iconSSC streezer hat folgendes geschrieben:
aber wenn ich da z.b. "line.stringbuilder" oder "line.join" machen will, geht das nicht - das attribut hab ich nicht zur verfügung :S



C#-Quelltext
1:
string test = string.Join(/*Parameter*/);                    


Mit Concat kannst du auch strings verketten:


C#-Quelltext
1:
string test = string.Concat(/*Parameter*/);                    


SSC streezer - Mi 02.07.08 11:05

hm ok hat geklappt vielen dank ! :P