none
Eine einfach INI - Datei in einem Treeview einlesen? RRS feed

  • Frage

  • Hallo "NG", 

    ich versuche eine gewöhnliche INI Datei in einem TreeView einzulesen - jedoch scheitern leider alle Versuche dies halbwegs vernünftig zu realisieren :-(

    Ich habe auch nach einer Lösung gegoogelt aber leider rein gar nichts gefunden. Vielleicht kennt jemand einen Link mit einem Lösungsansatz oder hat ein kleines Beispiels-Script irgendwo in der Schublade liegen - wäre sehr dankbar für jede Hilfe.

     

    BTW. ich weiss, dass das INI-Format alt ist und XML vermutlich die bessere Lösung für manche Bereiche darstellt, jedoch gehts mir hier um das Begreifen - dem "wie gehts..." 

     

    Grüße

    Robert S.

    Montag, 17. Januar 2011 14:47

Antworten

  • Hallo Robert,

    Es wäre hilfreich zu wissen, was Du in diesem Fall unter "halbwegs vernünftig" verstehst. Aber vielleicht kannst Du's ja besser sagen, wenn Du von einem (sehr einfachen) Beispielcode ausgehst:

    using System;
    using System.Linq;
    using System.Windows.Forms;
    using System.IO;
    
    namespace IniToTreeView
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void buttonIniToTreeView_Click(object sender, EventArgs e)
        {
          string iniFileName = "win.ini";
          string windowsDirectory = Environment.ExpandEnvironmentVariables("%WinDir%");
          string pathToWinIni = Path.Combine(windowsDirectory, iniFileName);
    
          treeView1.Nodes.Clear();
          TreeNode sectionRoot = treeView1.Nodes.Add(iniFileName);
          TreeNode currentSectionNode = null;
    
          using (TextReader iniReader = new StreamReader(pathToWinIni))
          {
            string line = String.Empty;
            line = iniReader.ReadLine().Trim();
            while (line != null)
            {
              line = line.Trim();
              if (line != String.Empty && line != ";")
                if (line.Length > 1 + 1 && line[0] == '[' && line[line.Length - 1] == ']')
                  // Section 
                  currentSectionNode = sectionRoot.Nodes.Add(line.Substring(1, line.Length - 1 - 1));
                else
                  if (line.Contains('='))
                  {
                    // Key & Value
                    string[] parts = line.Split('=');
                    TreeNode currentKeyNode = currentSectionNode.Nodes.Add(parts[0]);
                    currentKeyNode.Tag = parts[1];
                  }
              line = iniReader.ReadLine();
            }
          }
    
          if (treeView1.Nodes.Count <= 0)
            return;
    
          treeView1.ExpandAll();
          treeView1.Nodes[0].EnsureVisible();
        }
    
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
          if (e.Node.Tag != null)
            Text = (string)e.Node.Tag;
        }
      }
    }
    
    

    Gruß
    Marcel

    • Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 18. Januar 2011 07:28
    • Als Antwort markiert oReSo Dienstag, 18. Januar 2011 11:44
    Montag, 17. Januar 2011 19:26
    Moderator

Alle Antworten

  • Hallo Robert,

    Es wäre hilfreich zu wissen, was Du in diesem Fall unter "halbwegs vernünftig" verstehst. Aber vielleicht kannst Du's ja besser sagen, wenn Du von einem (sehr einfachen) Beispielcode ausgehst:

    using System;
    using System.Linq;
    using System.Windows.Forms;
    using System.IO;
    
    namespace IniToTreeView
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void buttonIniToTreeView_Click(object sender, EventArgs e)
        {
          string iniFileName = "win.ini";
          string windowsDirectory = Environment.ExpandEnvironmentVariables("%WinDir%");
          string pathToWinIni = Path.Combine(windowsDirectory, iniFileName);
    
          treeView1.Nodes.Clear();
          TreeNode sectionRoot = treeView1.Nodes.Add(iniFileName);
          TreeNode currentSectionNode = null;
    
          using (TextReader iniReader = new StreamReader(pathToWinIni))
          {
            string line = String.Empty;
            line = iniReader.ReadLine().Trim();
            while (line != null)
            {
              line = line.Trim();
              if (line != String.Empty && line != ";")
                if (line.Length > 1 + 1 && line[0] == '[' && line[line.Length - 1] == ']')
                  // Section 
                  currentSectionNode = sectionRoot.Nodes.Add(line.Substring(1, line.Length - 1 - 1));
                else
                  if (line.Contains('='))
                  {
                    // Key & Value
                    string[] parts = line.Split('=');
                    TreeNode currentKeyNode = currentSectionNode.Nodes.Add(parts[0]);
                    currentKeyNode.Tag = parts[1];
                  }
              line = iniReader.ReadLine();
            }
          }
    
          if (treeView1.Nodes.Count <= 0)
            return;
    
          treeView1.ExpandAll();
          treeView1.Nodes[0].EnsureVisible();
        }
    
        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
          if (e.Node.Tag != null)
            Text = (string)e.Node.Tag;
        }
      }
    }
    
    

    Gruß
    Marcel

    • Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 18. Januar 2011 07:28
    • Als Antwort markiert oReSo Dienstag, 18. Januar 2011 11:44
    Montag, 17. Januar 2011 19:26
    Moderator
  • Hallo Marcel,

     

    vielen Dank für deine Hilfe & Antwort. Das ist genau das, was ich vergeblich gesucht hatte. Ich konnte zwar den Root/Parents bereits anzeigen, jedoch wollte das Ganze mit den Kindern nicht klappen - mit deinem Script jedoch habe ich es prima umsetzen können - auch wenn du schreibst "sehr einfaches Beispiel", für mich war das eine Mega-Hürde.

    Vielen Dank nochmals

    grüße

    Robert

    Montag, 17. Januar 2011 20:05
  • Hallo Robert,

    > vielen Dank für deine Hilfe & Antwort.
    > Das ist genau das, was ich vergeblich gesucht hatte.

    Gerne.

    Gruß
    Marcel

    Montag, 17. Januar 2011 20:52
    Moderator
  • Hallo Robert,

    ggf. besser auch einen sauberen INI-Reader benutzen.

    Etwa folgendes:

    [IniReader - C# and VB.NET]
    http://www.mentalis.org/soft/class.qpx?id=6  [Download]


    (kurz wiederholt, Du hast es schon gesagt ... XML ist heutzutage natürlich etwas angesagter, oder das Nutzen von .NET config Dateien - es gibt ja auch viele weitere Konfigurations-Aspekte, die hier noch nicht genannt wurden, die dann ggf. schon automatisch gelöst sind)


    ciao Frank
    • Als Antwort vorgeschlagen Frank Dzaebel Dienstag, 18. Januar 2011 14:25
    Montag, 17. Januar 2011 21:26
  • Hallo Frank,

     

    auch dir einen herzlichen Dank, der IniReader ist wirklich eine "saubere" Sache :-)

     

    Grüße 

    Robert

    Montag, 17. Januar 2011 23:36
  • Hallo Robert,

       > .. dir einen herzlichen Dank, der IniReader ist wirklich
          eine "saubere" Sache :-)

    gerne.

     


    ciao Frank
    Dienstag, 18. Januar 2011 14:27
  • Hi Robert,
    hier mal eine kleine Demo zur Anregung:
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
     
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      {
        public Form1() { InitializeComponent(); }
     
        private SplitContainer sc = new SplitContainer() { Dock = DockStyle.Fill };
        private TreeView tv = new TreeView() { Dock = DockStyle.Fill };
     
        private void Form1_Load(object sender, EventArgs e)
        { this.Controls.Add(sc);
          sc.Panel1.Controls.Add(tv);
          LoadTreeViewFromIni(tv.Nodes);
        }
     
        internal void LoadTreeViewFromIni(TreeNodeCollection nc)
        {
          TreeNode n1 = null;
          using (StreamReader sr = new StreamReader("c:\\temp\\x.ini"))
          { while (!sr.EndOfStream)
            { string line = sr.ReadLine().Trim();
              if (line.StartsWith("["))
              { var txt = line.Split(new char[] { '[', ']' });
                n1 = new TreeNode(txt[1]);
                nc.Add(n1);
                continue;
              }
              if (line.Length > 0)
              { var txt = line.Split(new char[] { '=' });
                n1.Nodes.Add(new TreeNode(txt[0]));
              }
            }
          }
        }
      }
    }
     
    --
    Viele Grüße
    Peter
    Mittwoch, 19. Januar 2011 06:32