Avatar billede mcardle Nybegynder
25. oktober 2008 - 00:48 Der er 6 kommentarer og
1 løsning

Endnu et TreeView - Tilføj node under existerende node

Hej eksperter...

Jeg er helt ny i C# og jeg har lavet et TreeView, som lister mine dreve og det virker fint. Jeg har fundet et script der lister hele ens harddisk med det samme, men det tager jo en krig, så jeg følger Windows Modellen, men at man loader første level af noder og hvis jeg skal ind under en node mere, så opdatere man "on-the-go".

Hvordan putter jeg min nye fundne node ind under den eksisterende node, jeg har i forvejen?

//mcardle
Avatar billede kalp Novice
25. oktober 2008 - 09:59 #1
Et TreeNode object har også childNodes, som er en collection af TreeNodes..
så du kan bare appende et nyt TreeNode element til den Node du vil tilføje noget under.
Avatar billede mcardle Nybegynder
26. oktober 2008 - 09:25 #2
Jeg ved godt hvordan det virker, det er mere et eksempel jeg leder efter. PT. har jeg denne kode:


private void GetAllDrives()
{
    foreach (DriveInfo Drive in DriveInfo.GetDrives())
    {
        if (Drive.IsReady)
        {
            tv_MyComputer.Nodes.Add(new TreeNode(Drive.Name));
            ScanFirstLevel(Drive.Name);
        }
    }
}

private void ScanFirstLevel(string Path)
{
    foreach (string Dir in Directory.GetDirectories(Path))
    {
        Application.DoEvents();
            tv_MyComputer.Nodes[0].Nodes.Add(Dir);
        }
    foreach (string File in Directory.GetFiles(Path))
        {
            Application.DoEvents();
            // Tilføj filer til drev
        }
    }

Den får den ind under, men det er en dårlig måde at gøre det på, da jeg skal kende alle levels.

//mcardle
Avatar billede ulrikm Nybegynder
26. oktober 2008 - 20:49 #3
Jeg har gjort et forsøg, hvor jeg nedarver DirectoryTreeNode fra TreeNode og bygger træet dynamisk i en BeforeExpand. Hvis en mappe har undermapper, indsætter jeg i første omgang en dummy node, og umiddelbart før den "ekspanderes", tilføjes de rigtige undermapper. DirectoryTreeNode bruges til at holde styr på hvilken node der hører til hvilken mappe.

Jeg ved ikke om det vil være mere rigtigt at bruge noget data binding?

Der kommer nogle exceptions når jeg kører det på min maskine - dem ignorerer jeg bare, men du skal nok kigge nærmere på dem..

    public partial class Form1 : Form
    {
        private enum LoadType { AddSubDirs, AddDummyNode };

        public Form1()
        {
            InitializeComponent();
            treeView1.BeforeExpand += new TreeViewCancelEventHandler(treeView1_BeforeExpand);
            LoadRootLevel();
        }

        private void LoadRootLevel()
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                DirectoryInfo dir = new DirectoryInfo(drive.Name);
                DirectoryInfoTreeNode dirNode = new DirectoryInfoTreeNode(dir);
                treeView1.Nodes.Add(dirNode);
                LoadSubDirectories(dirNode,LoadType.AddDummyNode);
            }
        }

        private void treeView1_BeforeExpand(object sender,
                TreeViewCancelEventArgs e)
        {
            treeView1.BeginUpdate();

            LoadSubDirectories(e.Node,LoadType.AddSubDirs);

            treeView1.EndUpdate();
        }

        private void LoadSubDirectories(TreeNode treeNode, LoadType loadType)
        {
            treeNode.Nodes.Clear();
            DirectoryInfoTreeNode dirNode = treeNode as DirectoryInfoTreeNode;
            DirectoryInfo dir = dirNode.Dir;
            try
            {
                string[] subDirNames = Directory.GetDirectories(dir.FullName);
                if ( loadType == LoadType.AddSubDirs )
                {
                    foreach (string subDirName in subDirNames)
                    {
                        try
                        {
                            DirectoryInfo subDir = new DirectoryInfo(subDirName);
                            DirectoryInfoTreeNode subDirNode = new DirectoryInfoTreeNode(subDir);
                            treeNode.Nodes.Add(subDirNode);
                            LoadSubDirectories(subDirNode, LoadType.AddDummyNode);
                        }
                        catch (NotSupportedException)
                        {
                            // ignored
                        }
                    }
                }
                else
                {
                    if (subDirNames.Length > 0)
                    {
                        treeNode.Nodes.Add("DUMMY");
                    }
                }
            }
            catch (Exception)
            {
                // ignored
            }
        }

        private class DirectoryInfoTreeNode : TreeNode
        {
            private DirectoryInfo dir;

            internal DirectoryInfoTreeNode(DirectoryInfo dir)
                : base(dir.Name)
            {
                this.dir = dir;
            }

            internal DirectoryInfo Dir
            {
                get{ return dir;}
            }
        }

    }
Avatar billede mcardle Nybegynder
26. oktober 2008 - 21:21 #4
Du er skide god :oP

Det virker fino, kunne dog godt tænke mig, at den havde "Skrivebordet" i toppen af Tree'et. Nogle idéer? Du skal nok få lidt flere points, hvis du vil.

//mcardle
Avatar billede ulrikm Nybegynder
26. oktober 2008 - 22:24 #5
Her er et bud, med Skrivebord øverst og "Denne computer" under:

    public partial class Form1 : Form
    {
        private enum LoadType { AddSubDirs, AddDummyNode };

        public Form1()
        {
            InitializeComponent();
            treeView1.BeforeExpand += new TreeViewCancelEventHandler(treeView1_BeforeExpand);
            LoadDesktopLevel();
        }

        private void LoadDesktopLevel()
        {
            // skrivebord
            DirectoryInfo desktopDir = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
            DirectoryInfoTreeNode desktopNode = new DirectoryInfoTreeNode(desktopDir);
            treeView1.Nodes.Add(desktopNode);

            // denne computer
            TreeNode thisComputerNode = new TreeNode("Denne Computer");
            desktopNode.Nodes.Add(thisComputerNode);
            LoadDriveLevel(thisComputerNode);
        }

        private void LoadDriveLevel( TreeNode thisComputerNode )
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                DirectoryInfo dir = new DirectoryInfo(drive.Name);
                DirectoryInfoTreeNode dirNode = new DirectoryInfoTreeNode(dir);
                thisComputerNode.Nodes.Add(dirNode);
                LoadSubDirectories(dirNode,LoadType.AddDummyNode);
            }
        }

        private void treeView1_BeforeExpand(object sender,
                TreeViewCancelEventArgs e)
        {
            treeView1.BeginUpdate();

            LoadSubDirectories(e.Node,LoadType.AddSubDirs);

            treeView1.EndUpdate();
        }

        private void LoadSubDirectories(TreeNode treeNode, LoadType loadType)
        {
            RemoveDummyNodes(treeNode);
            DirectoryInfoTreeNode dirNode = treeNode as DirectoryInfoTreeNode;
            if (dirNode != null)
            {
                DirectoryInfo dir = dirNode.Dir;
                try
                {
                    string[] subDirNames = Directory.GetDirectories(dir.FullName);
                    if (loadType == LoadType.AddSubDirs)
                    {
                        foreach (string subDirName in subDirNames)
                        {
                            try
                            {
                                DirectoryInfo subDir = new DirectoryInfo(subDirName);
                                DirectoryInfoTreeNode subDirNode = new DirectoryInfoTreeNode(subDir);
                                treeNode.Nodes.Add(subDirNode);
                                LoadSubDirectories(subDirNode, LoadType.AddDummyNode);
                            }
                            catch (NotSupportedException)
                            {
                                // ignored
                            }
                        }
                    }
                    else
                    {
                        if (subDirNames.Length > 0)
                        {
                            treeNode.Nodes.Add("DUMMY");
                        }
                    }
                }
                catch (Exception)
                {
                    // ignored
                }
            }
        }

        private void RemoveDummyNodes(TreeNode treeNode)
        {
            foreach (TreeNode childNode in treeNode.Nodes)
            {
                if( childNode.Text == "DUMMY")
                    treeNode.Nodes.Remove(childNode);
            }
        }

        private class DirectoryInfoTreeNode : TreeNode
        {
            private DirectoryInfo dir;

            internal DirectoryInfoTreeNode(DirectoryInfo dir)
                : base(dir.Name)
            {
                this.dir = dir;
            }

            internal DirectoryInfo Dir
            {
                get{ return dir;}
            }
        }

    }
Avatar billede mcardle Nybegynder
28. oktober 2008 - 07:15 #6
Jeg tager lige selv points'ne og opretter et spørgsmål med point til dig...

//mcardle
Avatar billede mcardle Nybegynder
28. oktober 2008 - 07:18 #7
Du kan få dine points her: http://www.eksperten.dk/spm/850655
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester