Entwickler-Ecke

IO, XML und Registry - Treeview Knoten Inhalte in Textbox laden


bvbborussia - Sa 11.12.10 16:47
Titel: Treeview Knoten Inhalte in Textbox laden
Hallo Zusammen,

ich habe eine XML Datei die ich in ein Treeview einlese. Wie krieg ich, nach klick,einzelne Treeview Knoteninhalte in die Textbox eingefügt? Das Bild welches ich eingefügt habe zeigt das besser.

Vielen Dank.

Gruß
bvbborussia


Th69 - Sa 11.12.10 17:23

Du merkst dir in jedem TreeNode.Tag den zugehörigen Datensatz und schreibst den dann im TreeView.AfterSelect-Ereignis dann die Eigenschaften des Datensatzes in die dazugehörigen TextBoxen. Evtl. kannst bzw. mußt du je Ebene unterschiedliche Daten in die Tag-Eigenschaft schreiben.

Beim Auslesen mußt du dann entsprechend den Tag wieder in den Datensatz-Typ konvertieren, z.B.

C#-Quelltext
1:
2:
3:
4:
5:
6:
MyDataType datatype = e.Node.Tag as MyDataType;
if(datatype != null)
{
  // nun kannst du auf die Eigenschaften und Methoden von datatype zugreifen, z.B.
  textbox.Text = datatype.Name;
}


P.S: Eine andere Möglichkeit wäre "DataBinding", jedoch unterstützt das der TreeView nicht direkt, sondern du müßtest eine BindingSource, DataTable o.ä verwenden.


bvbborussia - Sa 11.12.10 17:40

Welche Using-Direktive muss ich für das MyDataType einfügen?

Versteh leider nicht ganz wie du das meinst, muss dabei auch sagen das ich nicht viele Erfahrung in C# habe.


Th69 - Sa 11.12.10 17:46

Damit meine ich einfach deine "gsd_geraete_daten.geraet" (oder wie auch immer dein Datentyp heißt -).


huuuuuh - Sa 11.12.10 17:46

MyDateType = MeinDatenTyp. in diesem Fall mehr dein Datentyp. also da, wo du während das Programm läuft, die Daten reinspeicherst. Das TreeView selbst kann die Daten nicht speichern...


bvbborussia - Sa 11.12.10 18:00

Wie komme ich den auf mein Datentyp mit C#? Über XElement oder wie?


Th69 - Sa 11.12.10 18:08

Wie liest du denn überhaupt die XML-Datei ein und erzeugst den TreeView daraus. Dafür benötigst du doch schon deinen eigenen Datentypen :?:


bvbborussia - Sa 11.12.10 18:16

Also so les ich die Datei ein und füg die im Treeview ein:


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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
 private void xmlDeviceData_Click(object sender, EventArgs e)
        {
            openFileDialog1.InitialDirectory = "C:/Users/Bleri/Documents/Visual Studio 2010/Projects/MieleProjekt";
            openFileDialog1.Title = "Lade die XMLDeviceData-Datei";
            openFileDialog1.FileName = "XMLDeviceData";
            openFileDialog1.Filter = "XML Datei|*.xml";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                
                sr = new System.IO.StreamReader(openFileDialog1.FileName);

                xmldoc = new XmlDocument();
                xmldoc.Load(sr);
                treeView.Nodes.Clear();

                treeView.Nodes.Add(new TreeNode(xmldoc.DocumentElement.LocalName));

                TreeNode tNode = new TreeNode();

                tNode = treeView.Nodes[0];

                AddNode(xmldoc.DocumentElement, tNode);

                treeView.ExpandAll();
                treeView.CollapseAll();

            }
        }
private void AddNode(XmlNode inXmlNode, TreeNode inTreeNode)
        {

            XmlNode xNode;
            TreeNode tNode;
            XmlNodeList nodeList;
            int i;
            // Loop through the XML nodes until the leaf is reached.
            // Add the nodes to the TreeView during the looping process.

            if (inXmlNode.HasChildNodes)
            {
                nodeList = inXmlNode.ChildNodes;

                for (i = 0; i <= nodeList.Count - 1; i++)
                {
                    xNode = inXmlNode.ChildNodes[i];
                    inTreeNode.Nodes.Add(new TreeNode(xNode.Name));
                    // inXmlNode
                    tNode = inTreeNode.Nodes[i];
                    AddNode(xNode, tNode);
                }
            }
            else
            {
                // Here you need to pull the data from the XmlNode based on the
                // type of node, whether attribute values are required, and so forth.
                inTreeNode.Text = (inXmlNode.OuterXml).Trim();
            }
        }


Vielen Dank Th69...

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Th69 - Sa 11.12.10 18:52

Hallo BVB-Fan -)

so wird das leider nichts. Das händische Einlesen von XML-Dateien ist sehr umständlich und fehleranfällig. Außerdem hast du jetzt keine Trennung von Daten und Ansicht (GUI).

Besser ist es mittels "XML-Serialisierung" die Daten in geeignete Datenstrukturen (Klassen) abzulegen und den TreeView anhand dieser Datenstruktur zu füllen.
(Bisher füllst du auch noch den TreeView falsch. Du willst doch sicherlich die Werte sehen, d.h. xNode.Value und nicht den Namen der Node-Klasse).

Zum Thema "XML-Serialisierung" lies dich mal z.B. unter
- http://openbook.galileocomputing.de/visual_csharp/visual_csharp_11_004.htm#mja44aa0706bf368ccd52850c8a5129ca4
- http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization
- Einführung in die XML-Serialisierung [http://msdn.microsoft.com/de-de/library/182eeyhh%28v=vs.80%29.aspx] und Steuern der XML-Serialisierung mit Attributen [http://msdn.microsoft.com/de-de/library/2baksw0z%28VS.80%29.aspx]
ein.

P.S. Ist das ein privates Projekt oder eine Studien- bzw. Azubiprojektarbeit?


huuuuuh - Sa 11.12.10 19:03

warum nich gleich hier bleiben, wenn wir was über XML-Serialisierung wissen wollen?
http://www.c-sharp-library.de/topic_Mit+XmlSerializer+Objekte+als+XML+speichern+und+laden_64947.html

XML-(De)Serialisierung ist sehr nützlich. erzeugt übersichtliche XML-Dateien ohne dass man viel für machen brauch. nur ne Klasse für die Daten, das wars...


bvbborussia - Sa 11.12.10 19:06

Ja ich hoffe wie können auch heute gewinnen!!!

Nein das ist ein privates Porjekt. Ich will XML-Dateien nicht mehr über einen Editor befüllen und ändern sondern das ganze programmtechnisch realisieren. Ich studiere auch nebenbei Informatik und bin jetzt halt in der Frühphase der Programmierung, deshalb möchte ich mir das durch solche eigene ausgedachte Projekt erlernen.

Ich werde mir die Links auf jedenfall angucken und ich hoffe ich versteh das ansonsten mußt du mir wohl weiter helfen.

Vielen Dank für dein Mühe Th69