Announcement

Collapse
No announcement yet.

TreeView Windows Explorer

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TreeView Windows Explorer

    Hallo zusammen,

    ich bin dabei ein Backup Programm zu schreiben. Ich erstelle einen Auftrag in dem ich eine TreeView habe, der wie ein Explorerbaum aufgebaut ist. Dort kann ich die Quellen auswählen indem ich die entsprechenden Verzeichnisse und Dateien checke. In einer 2. TreeView wähle ich dann das Ziel aus. Diese Daten werden mit ein paar anderen Daten (Auftragsname, Ausführungszeitpunkt- und Häufigkeit) in eine XML Datei gespeichert. Also nach dem Motto

    <TaskID = 1>
    <Source>Ordner 1</Source>
    <Source>Ordner 2</Source>
    <Destination>Zielordner</Destination>
    ...



    Diese XML lese ich dann in ein ListView ein. Aus dem ich dann mehrere Möglichkeiten haben. Auftrag ausführen, Auftrag löschen und Auftrag bearbeiten. Da liegt mein Problem. Ich möchte beim bearbeiten wieder einen TreeView angezeigt bekommen, in dem der TreeView aufgebaut wird und mit die Quellen checkt. Außerdem sollen auch alle anderen Ordner (überordner) bis zur Quelle angezeigt werden (nicht gecheckt). Ich übergebe die Quellen über einen String z.b "D:\Eigene Bilder\Urlaub|D:\Eigene Bilder\Party|D:\Eigene Musik" (durch pipes getrennt)

    Ich habe es schon hinbekommen, dass er mit die ausgewählten Quellen in einen TreeView ausgibt und checkt (siehe Code). Nun möchte ich aber z.b. bei einer Quelle D:\Eigene Bilder\Urlaub alle Ordner und Dateien in D:\ zum TreeView hinzufügt, den Node Eigene Bilder ausklappt, dann mir alle Ordner und Dateien im Node Eigene Bilder anzeigt und den Ordner Urlaub Urlaub checkt. So auch mit den anderen Quellen.

    Das ganze muss wohl mit einen Directory.GetDirectories bzw. GetFiles machbar sein. Nur an den stellen wo ich das eingefügt habe (innerhalb der Schleife in der die Quellen ausgelesen werden) werden mir die gesamten Nodes mehrfach hinzugefügt (wenn mehrere Quellen). Ich hab den unten genannten Code aus einem anderen Forum, in dem mir nicht weitergeholfen wurde, da werden Hashtables verwendet, die eigentlich dafür sorgen sollen, dass Nodes nicht doppelt hinzugefügt werden, da ich keine Ahnung von Hashtables habe und den Code nicht ganz blicke, erschwert dies mich ein wenig. Könntet Ihr mit Hilfestellung geben. Vllt eine Alternative von Hashtables. Ich benutze .Net Framework 4.

    Hier mein Code. Vielen Dank

    Code:
    private void test(TreeNode parentNode, String NodeSource)
        {
          //Hashtable erzeugen
          Hashtable dictNode = new Hashtable();
    
          //Hier liegen die String in Form "D:\Eigene Bilder\Urlaub|D:\Musik\Internet|D:\Musik\Alben" per | getreent
          string[] sources = NodeSource.Split('|');
          foreach (string readDir in sources)
          {
            //Ausgelesene Zeile bei "\" splitten:
            string[] splittedPath = readDir.Split('\\');
    
            string strBegin = "";
    
            parentNode = null;
    
            foreach (string pathSplitter in splittedPath)
            {
              //Wenn das Element leer ist, abbrechen
              if (pathSplitter == "")
              {
                break;
              }
    
              //strBegin += "\\" + pathSplitter;
              strBegin += pathSplitter+ "\\";
    
              if (dictNode.ContainsKey(strBegin))
              {
                parentNode = (TreeNode)dictNode[strBegin];
                continue;
              }
    
              dictNode[strBegin] = new TreeNode(pathSplitter);
    
              if (parentNode == null)
              {
                this.treeView1.Nodes.Add((TreeNode)dictNode[strBegin]);
              }
              else
              {
                //MessageBox.Show(parentNode.FullPath);
    
                parentNode.Nodes.Add((TreeNode)dictNode[strBegin]);
                parentNode.Expand();
    
                //Ausgewählten Node checken
                if (((TreeNode)dictNode[strBegin]).FullPath == readDir)
                {
                  ((TreeNode)dictNode[strBegin]).Checked = true;
                }
    
              }
              parentNode = (TreeNode)dictNode[strBegin];
            }
          }
        }

  • #2
    Es ist grundsätzlich immer schlecht irgendwelche Programmlogik in ein Control zu basteln. Baue Dir erstmal Klassen die Dein Problem wiederspiegeln. Diese werden dann später irgendwie an die Oberfläche weiter gereicht (z.B. per DataBinding). Genau diese Logik könntest Du dann im anderen Teil auch wiederverwenden um Deinen Auftrag nochmal anzuzeigen.

    Comment


    • #3
      Erst einmal Danke für deine schnelle Antwort.

      Ich bin ein C# Neuling, habe vorher ein paar sachen in VBS und VBA geskriptet, aber das ist mein ersten OO-Programm.

      Habe von Klassen nicht so viel Ahnung, weiß auch nicht ob diese mir weiterhelfen würden. Wie gesagt ich erstelle einen Auftrag wo ich mir einen TreeView per Node_MouseClick erstelle und die gecheckten Ordner / Dateien in eine XML Datei schreibe. Diesen TreeView zwischen zu speichern fände ich etwas schwierig.

      Wenn ich einen Auftrag direkt nach Erstellung ändern möchte mag das funktionieren. Wenn ich jedoch nach einer Woche auf die Idee komme den Auftrag zu ändern und andere Quellen auszuwählen oder abzuwählen weiß ich nicht wie ich z.B. ein DataBinding so erstelle, dass ich immer drauf zugriff habe.

      Habe eine XML Datei gewählt um die Quellen zu speichern, damit diese außerhalb des Programms liegt (Alternativ hätt ich eine Datenbank genommen)

      Dein Lösungsansatz ist bestimmt der bessere, aber da ich absoluter Neuling bin und erst ein paar Funktionen erstellt habe ist das was du vorgeschlagen hast totales Neuland.

      Comment


      • #4
        Na z.B. so:

        Du baust Dir erstmal Entitäten die einen Task respräsentieren:

        [highlight=c#]
        public class Task
        {
        public int TaskId { get; set; }
        public IList<String> Sources { get; set; }
        public String Destination { get; set; }
        }
        [/highlight]

        So jetzt kannst Du z.B. eine Liste von den Objekten erzeugen oder Sie auch per XML oder Binär serialisieren um sie abzuspeichern. Das heisst Du kannst Objekte erzeugen, speichern und diese wieder laden. Damit wäre schon mal ein Teil Deiner Anforderungen erledigt. Nun musst Du nur noch eine Möglichkeit schaffen diese Liste in ein Treeview zu bekommen. Das kann z.B. über DataBinding passieren (was ich aber bei einem TreeView anzweifle) oder eben per Hand.
        Leider ist es etwas schwierig den kompletten Umfang hier zu erklären, da das doch ein etwas umfangreicheres Thema ist

        Comment


        • #5
          Danke für deine Ausführung, aber ich denke da Blicke ich so schnell nicht durch.

          Ich werde mich darüber erkundigen und schauen ob ich es damit hinbekomme. Vielen Dank dafür.

          Kann man mit dem Code den ich gepostet hatte, dies nicht schneller und einfacher hinbekommen. Mir wurde gesagt dass ich einfach ein Directory.GetDirectories einbinden müsste und dann würde das funktionieren.

          Nur leider wollte mir keiner sagen wo ich das einbinden muss.

          Diese Lösung (wenn Sie funktionieren würde) wäre zwar nicht die sauberste, aber wenn es funktionieren würde, wäre das schon einmal ein Anfang.

          Denkst du das würde gehen?

          Comment


          • #6
            Na Du musst halt die XML Dateien wieder einlesen und das TreeView daraus erstellen. Danach kannst Du die ja mit dem normalen Verfahren wieder speichern.

            Comment


            • #7
              Naja gut,

              das was mich ein wenig anschreckt, dass ich ein weiteres Objekt speichern muss, dies würde auch bedeuten, dass ich Programm nicht an mehreren Arbeitsplätzen benutzen kann und auch die gleiche XML zugreifen kann, da der TreeView mit allen Objekten im Programmordner gespeichert ist.

              Ich habe halt eine Funktion implementiert die es erlaubt XML Dateien und Exportieren und Aufträge einer XML zu importieren. Wenn ich den TreeView in einem Objekt speichere ist ein Austausch demnach nicht mehr so einfach möglich, oder sehe ich das falsch?

              Comment


              • #8
                Du musst doch gar nicht das TreeView speichern oder sehe ich das falsch? Du willst doch Aufträge einfach nochmal öffnen und diese irgendwie bearbeiten. Wenn sie gelöscht werden, dann verschwinden sie auch aus der XML Datei oder? Also musst Du doch nur sämtliche XML Dateien in einem Ordner öffnen und diese dann wieder im TreeView anzeigen. Dann kannst Du Sie bearbeiten und die gleichen XML Dateien wieder überschreiben. Oder soll da noch irgendwas anderes passieren? Ich verstehs irgendwie nicht.

                Comment


                • #9
                  Ja das ist korrekt, aber das funktioniert nun auch schon.

                  Mein Problem ist: Wenn ich einen Pfad habe "D:\Eigene Bilder\Urlaub" zeigt mir die TreeView an:

                  D:\
                  Eigene Bilder\
                  Urlaub\

                  Es sollen mir aber alle Ordner unter D: angezeigt werden, also:

                  D:\
                  Download\
                  Eigene Bilder\
                  Urlaub\
                  Feiern\
                  Familie\
                  Freunde\
                  Eigene Dokumente\
                  Eigene Musik\
                  Eigene Videos\

                  Ich hänge mal 2 Bilder dran als Beispiel:
                  Das Bild Auftrag_erstellen stellt dar, wie der TreeView aufgebaut wird. Die angehakten Ordner werden dann in die XML geschrieben. Zuerst werden nur die Laufwerke angezeigt. Durch Aufklappen der Nodes werden dann die übrigen Ordner angezeigt, welche dann ausgewählt werden können.

                  Wenn ich dann einen Auftrag bearbeiten will stellt er mir die Ordner dar wie auf dem Bild Auftrag_bearbeiten (Die Icons außen vor gelassen). Jedoch möchte ich dass die Ansicht gleich ist wie bei Auftrag_erstellen.

                  Hoffe ich konnte dir erklären, was ich vor haben.

                  Gruß partywelt
                  Attached Files

                  Comment


                  • #10
                    Hallo zusammen, habe es mittlerweile über Umwege und Zwischenvariablen geschafft mein Ziel zu erreichen:

                    Code:
                    using System;
                    using System.Collections.Generic;
                    using System.ComponentModel;
                    using System.Data;
                    using System.Drawing;
                    using System.Drawing.Imaging;
                    using System.Linq;
                    using System.Text;
                    using System.Windows.Forms;
                    using System.IO;
                    using System.Security;
                    using System.Security.Permissions;
                    using System.Security.Policy;
                    using System.Runtime.InteropServices;
                    using System.Collections;
                    using System.Data.SqlClient;
                    using System.Xml;
                    
                    namespace WindowsFormsApplication1
                    {
                        public partial class Form4 : Form
                        {
                            Hashtable treenodes = new Hashtable();
                            ArrayList openNodes = new ArrayList();
                            public Form4(string Src)
                            {
                                InitializeComponent();
                                drives_Src(Src);  
                                checkNodes(Src);
                            }
                    
                            private void drives_Src(string source)
                            {
                                TreeNode node = new TreeNode();
                                 
                                foreach (string drive in Directory.GetLogicalDrives())
                                {
                                    try
                                    {
                                        string NodeSrc = "";
                                        Boolean fehler = true;
                                        string NodeSource = "";
                                        string[] sources = source.Split('|');
                                        foreach (string strSource in sources)
                                        {
                                            string[] strNode = strSource.Split('\\');
                                            string NodeSrctemp = strNode[0] + "\\";
                                            if (drive == NodeSrctemp)
                                            {
                                                if (NodeSrctemp == NodeSrc)
                                                {
                                                    NodeSource = NodeSource + "|" + strSource;
                                                    fehler = false;
                                                }
                                                else
                                                {
                                                    NodeSrc = NodeSrctemp;
                                                    NodeSource = strSource;
                                                    fehler = false;
                                                }
                                            }
                                        }
                                        if (fehler == false)
                                        {
                                            eNode_Src(NodeSource,drive);
                                        }
                                        else
                                        {
                                            DriveType drive_type = GetDriveType(drive);
                                            string[] strdrive = drive.Split('\\');
                                            node = treeView1.Nodes.Add(drive);
                    
                                            switch (drive_type.ToString())
                                            {
                                                case "DRIVE_FIXED":
                                                    node.ImageKey = "drive";
                                                    node.SelectedImageKey = "drive";
                                                    break;
                                                case "DRIVE_REMOTE":
                                                    node.ImageKey = "network";
                                                    node.SelectedImageKey = "network";
                                                    break;
                                                case "DRIVE_CDROM":
                                                    node.ImageKey = "cdrom";
                                                    node.SelectedImageKey = "cdrom";
                                                    break;
                                                default:
                                                    node.ImageKey = "drive";
                                                    node.SelectedImageKey = "drive";
                                                    break;
                                            }
                    
                                            //Dummynodes einfügen
                                            TreeNode dummy = new TreeNode();
                                            dummy = node.Nodes.Add("");
                                            dummy.ImageKey = "folder";
                                        }
                                    }
                                    catch { }
                                }
                            } //Ende drives_Src()
                    
                            public enum DriveType
                            {
                                DRIVE_UNKNOWN = 0,
                                DRIVE_NO_ROOT_DIR = 1,
                                DRIVE_REMOVABLE = 2,
                                DRIVE_FIXED = 3,
                                DRIVE_REMOTE = 4,
                                DRIVE_CDROM = 5,
                                DRIVE_RAMDISK = 6
                            } //Ende DriveType
                    
                            // Um heraus zu finden um was für ne laufwerksart es sich handelt...
                            [DllImport("KERNEL32", EntryPoint = "GetDriveType")]
                            public static extern DriveType GetDriveType(string sDrive);
                    
                            int i = 0;
                    
                            // TreeView Quelle
                            private void eNode_Src(string SrcNodes, string drive)
                            {
                                TreeNode parentNode = null;
                                
                                string[] Sources = SrcNodes.Split('|');
                                foreach (string Source in Sources)
                                {
                                    TreeNode tmp = null;
                                    string SrcPart = "";
                                    string[] splittetSrc = Source.Split('\\');
                                    foreach (string SrcParted in splittetSrc)
                                    {
                    
                                        if (SrcPart == "")
                                        {
                                            SrcPart = SrcParted + "\\";
                                            Boolean vorhanden = false;
                    
                                            foreach (DictionaryEntry node in treenodes)
                                            {
                                                if (node.Value.ToString() == SrcPart)
                                                {
                                                    vorhanden = true;
                                                    parentNode = (TreeNode)node.Key;
                                                }
                                            }
                    
                                            if (vorhanden != true)
                                            {
                                                parentNode = treeView1.Nodes.Add(drive);
                                                parentNode.Expand();
                                                treenodes.Add(parentNode, drive); 
                                            }                    
                                        }
                                        else
                                        {
                                            SrcPart += SrcParted + "\\";
                                            parentNode = tmp;
                                        }
                                        foreach (string dir in Directory.GetDirectories(SrcPart))
                                        {
                                            try
                                            {
                                                Boolean vorhanden = false;
                                                TreeNode dir_t = new TreeNode();
                                                TreeNode test = new TreeNode();
                                                string[] ordnername = dir.Split('\\');
                                                i = ordnername.Length - 1;
                    
                                                foreach (DictionaryEntry node in treenodes)
                                                {
                                                    if (node.Value.ToString() == dir)
                                                    {
                                                        vorhanden = true;
                                                        if (Source.Contains(dir) && dir != Source)
                                                        {
                                                            parentNode.Nodes.Remove((TreeNode)node.Key);
                                                            dir_t = parentNode.Nodes.Add(ordnername[i].ToString());
                                                            this.treeView1.Sort();
                                                            dir_t.Expand();
                                                            dir_t.ImageKey = "folder";
                                                            dir_t.SelectedImageKey = "folder";
                                                            tmp = dir_t;
                                                        }
                                                    }
                                                }
                                                if (vorhanden != true)
                                                {
                                                    dir_t = parentNode.Nodes.Add(ordnername[i].ToString());
                                                    dir_t.Expand();
                                                    dir_t.ImageKey = "folder";
                                                    dir_t.SelectedImageKey = "folder";
                                                    if (Source.Contains(dir))
                                                    {
                                                        tmp = dir_t;
                                                    }
                                                    treenodes.Add(dir_t, dir); 
                                                }
                                            }
                                            catch (Exception ex)
                                            {
                                                MessageBox.Show("Catch: " + ex.Message + " dir: " + dir);
                                            }
                                        }
                                    }
                                }
                            }//Ende treeView1 (Quelle)
                    
                            private void checkNodes(String SrcNodes)
                            {
                                string[] tmpSources = SrcNodes.Split('|');
                                foreach (string Source in tmpSources)
                                {
                                    //String Source vorbereiten
                                    string strTemp = "";
                                    string[] strSource = Source.Split('\\');
                    
                                    foreach (string tmpStr in strSource)
                                    {
                                        if (strTemp == "")
                                        {
                                            strTemp = tmpStr + "\\";
                                        }
                                        else
                                        {
                                            strTemp += "\\" + tmpStr;
                                        }
                                    }
                    
                                    // Hier werden die Nodes gecheckt
                                    CallRecursive(treeView1, strTemp);
                                }
                            }
                    
                            private void PrintRecursive(TreeNode treeNode, String Source)
                            {
                    
                                if (treeNode.Text != "")
                                {
                                    if (treeNode.FullPath == Source)
                                    {
                                        treeNode.Checked = true;
                                    }
                                }
                    
                                foreach (TreeNode tn in treeNode.Nodes)
                                {
                                    PrintRecursive(tn, Source);
                                }
                            }
                    
                            // Call the procedure using the TreeView.
                            private void CallRecursive(TreeView treeView, string Source)
                            {
                                TreeNodeCollection nodes = treeView.Nodes;
                                foreach (TreeNode n in nodes)
                                {
                                    PrintRecursive(n, Source);
                                }
                            }
                        }
                    }

                    Comment


                    • #11
                      Danke für die Antwort und Dein Ergebnis

                      Comment

                      Working...
                      X