Avatar billede qumle Nybegynder
08. juli 2004 - 14:26 Der er 14 kommentarer og
1 løsning

tree browser

jeg skal lave en windows applikation, hvor jeg skal bruge en træ struktur til at browse efter filer ala windows explorer.

jeg kunne selvfølgelig bruge OpenFileDialog. Men jeg har brug for at træet er synligt hele tiden og ikke som en popup når jeg vil åbne en fil.

Findes der en control el. lign som kan klare dette for mig. har kigget lidt på TreeView. men det virker som om man selv skal tilføje alle noder.

jeg ville gerne bare angive f.eks C: og så kan brugeren browse her
Avatar billede finger Nybegynder
08. juli 2004 - 14:28 #1
der er ikke en standard .NET control til dette, men prøv at søge lidt på nettet efter en koder som evt har lavet dette.
Avatar billede finger Nybegynder
08. juli 2004 - 14:34 #2
men det er ret let at lave sådan en.
Du skal bare kigge på at kombinere det med FileInfoCollection (tror jeg det hedder) eller DirectoryInfoCollection
Avatar billede wisen Nybegynder
09. juli 2004 - 09:31 #3
.. hvis du kan lidt VB kan du sikkert finde noget her du kan "låne" fra : http://msdn.microsoft.com/vbasic/default.aspx?pull=/library/en-us/dv_vstechart/html/vbpowerpack.asp
Avatar billede qumle Nybegynder
09. juli 2004 - 10:01 #4
tak for kommentaren det hjalp mig en del videre

foreløbig løsning

jeg fylder træet op på denne måde.
Det er ganske vist kun diredtories i roden og deres filer men det er vel bare et spørgsmål om at lave den rekursiv.

DirectoryInfo di = new DirectoryInfo("C:\\");
            DirectoryInfo[]dirs = di.GetDirectories();
            //string[]dirs = Directory.GetDirectories("C:\\");
            for (int i=0; i<dirs.Length; i++)
            {   
                DirectoryInfo di2 = new DirectoryInfo(dirs[i].FullName);
                FileInfo[]files = di2.GetFiles();
                TreeNode[]children = new TreeNode[files.Length];
                for(int j=0 ; j<files.Length ; j++)
                {
                    children[j] = new TreeNode(files[j].Name);
                }
                TreeNode tn = new TreeNode(dirs[i].Name,children);
                treeView1.Nodes.Add(tn);
            }

dette er tilsyneladende ikke muligt i et TreeView/TreeNode som skal have en string.

Findes der en bedre control til mit formål?
Avatar billede qumle Nybegynder
09. juli 2004 - 10:03 #5
->wisen
det ser ud som om det er lige hvad jeg skal bruge men findes controllerne ikke til C#? kunne ikke finde dem på msdn.
Avatar billede wisen Nybegynder
09. juli 2004 - 10:12 #6
gumle -> Jeg kunne heller ikke finde dem på C#'sk
Avatar billede qumle Nybegynder
09. juli 2004 - 11:31 #7
anyway er det vist også en ekstra pakke man skal købe...
Power packs?
Avatar billede wisen Nybegynder
09. juli 2004 - 11:48 #8
Nej, Power Pack'en er gratis og kan hentes på følgende adresse : http://www.gotdotnet.com/Community/Workspaces/workspace.aspx?id=167542e0-e435-4585-ae4f-c111fe60ed58

Kildekodenb følger med, så det burde ikke være det store problem at "konvertere" det til C#
Avatar billede qumle Nybegynder
12. juli 2004 - 08:30 #9
wisen-> controllerne i PP kunne så vidt jeg kunne se kun vise enten filer eller foldere. Jeg har brug for begge i samme vindue. Så jeg har lavet mine egne extensions af TreeNode klassen, men source koden til PP var en stor hjælp til dette.

Til dette brugte jeg FileInfo og DirectoryInfo som finger foreslog. nu skal jeg bare kunne skelne mellem directories og files når jeg hiver dem ud af træet.

her har jeg tænkt mig at lave en abstrakt klasse som ken indeholde denne information

Kode

FileNodes:

public class FileTreeNode : TreeNode
    {
        FileInfo file;

        public FileTreeNode(FileInfo fi)
        {
            this.Text=fi.Name;
            file = fi;
        }

        public FileInfo File
        {
            get {return file;}
            set {file = value;}
        }

        public bool IsDirectory
        {
            get {return false;}

        }
    }

Directory Nodes:

public class DirectoryTreeNode : TreeNode
    {
        DirectoryInfo directory;

        public DirectoryTreeNode(DirectoryInfo dir)
        {
            this.Text=dir.Name;
            directory = dir;
        }

        public DirectoryTreeNode(DirectoryInfo dir, TreeNode[]children)
        {
            this.Text = dir.Name;
            foreach(TreeNode tn in children)
            {
                this.Nodes.Add(tn);
            }
            directory = dir;
        }


        public DirectoryInfo Directory
        {
            get {return directory;}
            set {directory = value;}
        }

        public bool IsDirectory
        {
            get {return true;}

        }
    }

udsnit af constructor til programmet, her genereres træet

            DirectoryInfo di = new DirectoryInfo("C:\\");
            DirectoryInfo[]dirs = di.GetDirectories();
            //string[]dirs = Directory.GetDirectories("C:\\");
            for (int i=0; i<dirs.Length; i++)
            {   
                DirectoryInfo temp = dirs[i];
                DirectoryInfo di2 = new DirectoryInfo(dirs[i].FullName);
                FileInfo[]files = di2.GetFiles();
                FileTreeNode[]children = new FileTreeNode[files.Length];
                for(int j=0 ; j<files.Length ; j++)
                {
                    children[j] = new FileTreeNode(files[j]);
                }
                DirectoryTreeNode dtn = new DirectoryTreeNode(dirs[i],children);
                treeView1.Nodes.Add(dtn);
            }
Avatar billede qumle Nybegynder
12. juli 2004 - 08:32 #10
rettelse til kommentar 4:

dette er tilsyneladende ikke muligt i et TreeView/TreeNode som skal have en string.
skulle have været.

jeg vil gerne gemme alle oplysninger om filer/directories i træet, ikke kun navnet.
dette er tilsyneladende ikke muligt i et TreeView/TreeNode som skal have en string.

men dette problem har jeg løst ved at lave en extension til TreeNode
Avatar billede finger Nybegynder
12. juli 2004 - 10:28 #11
En treenode har så vidt jeg husker mulighed for at hæfte et object ved sig. det kan du jo bruge til at hæfte oplysninger omkring en file eller dir.
Avatar billede qumle Nybegynder
12. juli 2004 - 12:56 #12
du har ret.
Der er en property som hedder Tag som kan indeholder et object.
ikke et videre passende navn syns jeg men ok.
havde også ledt efter denne funktionalitet men har overset det.
det kan så afløse mine nedarvede klasser
Avatar billede finger Nybegynder
12. juli 2004 - 13:07 #13
ja ikke et så heldigt navn...
Ja det kan sagtens afløse dine nedarvede klasser. du kan jo bare smide en FileInfo eller DirInfo instans ind i Tag og så chekke på typen når du skal have det ud igen
Avatar billede qumle Nybegynder
13. juli 2004 - 12:32 #14
præcis.

nu har jeg en god ide om hvordan jeg skal løse problemet.
finger hvis du lige lægger et svar får du nogle point
Avatar billede finger Nybegynder
13. juli 2004 - 12:51 #15
svar :-)
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