Na záložce Files zobrazíme jednotlivé disky a jejich adresáře a soubory.
Kliknutím na některé soubory zobrazíme odpovídající panel
Podadresáře budeme načítat průběžně podle toho, které adresáře si uživatel bude prohlížet.
Aby byly vidět značky naznačující, že prvek stromu má v sobě schované další větve,
načteme do stromu o úroveň (o patro) prvků více než uživatel dosud navštívil.
Rozšíříme standardní třídu TreeNode o proměnnou path skladující kompletní cestu k souboru,
a proměnou ready obsahující příznak, zda byly nacteny i podadresáře daného uzlu.
class FileNode : TreeNode { public string path; public bool ready = false; // true ... podadresare jiz nacteny }
Metoda displayDrives
private void displayDrives () { fileTree.Nodes.Clear (); DriveInfo[] roots = DriveInfo.GetDrives (); foreach (DriveInfo r in roots) displayDirectory (fileTree.Nodes, r.RootDirectory); }
Metoda displayDirectory
private void displayDirectory (TreeNodeCollection target, DirectoryInfo dir, int levels = 2) { FileNode node = new FileNode (); node.path = dir.FullName; node.ready = false; node.Text = dir.Name; node.ToolTipText = node.path; node.ForeColor = Color.Blue; target.Add (node); displayDetail (node, dir, levels); }
Metoda displayFile obdoně zobrazí informace o jednom souboru.
Standardní třida FileInfo také může poskytnout informace o délce a datumu souboru
private void displayFile (TreeNodeCollection target, FileInfo f) { FileNode node = new FileNode (); node.path = f.FullName; node.ready = true; node.Text = f.Name; node.ToolTipText = node.path; node.ForeColor = Color.Orange; target.Add (node); }
Metoda displayDetail
private void displayDetail (FileNode node, DirectoryInfo dir, int levels) { if (levels > 1) try { foreach (FileInfo f in dir.GetFiles ()) displayFile (node.Nodes, f); foreach (DirectoryInfo d in dir.GetDirectories ()) displayDirectory (node.Nodes, d, levels - 1); node.ready = true; } catch (Exception e) { TreeNode t = new TreeNode (); t.Text = e.ToString (); t.ToolTipText = e.StackTrace; t.ForeColor = Color.Red; node.Nodes.Add (t); } }
Pokud uživatel “rozklikne” v2tev stromu, dřive než uvidí výsledek, tak proběhne treeView_BeforeExpand
V parametru e se skrývá odkaz na otvíranou větev e.Node, \ ta by již měla být dobře zobrazena, my se podíváme na dosud skryté pod poduzly e.Node.Nodes.
Poduzly přetypujeme na FileNode
FileNode node = n as FileNode;
pokud by n bylo jen TreeNode (např. červená zpráva o chybě), bude node rovno null.
Pro jednotlivé poduzly nám standardní třída DirectoryInfoposkytne informace o adresáři na disku new DirectoryInfo (node.path)
Pokud by při tom vznikla výjimka, přidáme try … catch
DirectoryInfo dir = new DirectoryInfo (node.path);
Nakonec funkce displayDetail přidá do stromu vnořené adresáře a soubory
private void treeView_BeforeExpand (object sender, TreeViewCancelEventArgs e) { foreach (TreeNode n in e.Node.Nodes) { FileNode node = n as FileNode; if (node != null && !node.ready) { try { DirectoryInfo dir = new DirectoryInfo (node.path); displayDetail (node, dir, 2); } catch (Exception ex) { } } } }
Při dvojitém kliknutí do stromu pomocí FileInfo získáme příponu souboru a pro některé přípony zobrazíme panel
private void fileTree_DoubleClick (object sender, EventArgs e) { TreeNode node = fileTree.SelectedNode as TreeNode; if (node != null) { string path = node.FullPath; FileInfo f = new FileInfo (path); string ext = f.Extension; statusLabel.Text = path + ", " + ext; switch (ext) { case ".txt": case ".bat": case ".ini": case ".cs": case ".c": case ".cpp": case ".cc": case ".h": case ".hpp": displayText (path); break; case ".png": case ".bmp": case ".jpg": case ".jpeg": displayImage (path); break; case ".csv": displayTable (path); break; case ".chart": displayChart (path); break; case ".html": displayHtml (path); break; } } }
Funkce displayText vytvoří nový panel TextArea a zavolá dále popsanou funkci displayObject
public void displayText (string path) { TextArea a = new TextArea (path); displayObject (a); } public void displayImage (string path) { ImageArea a = new ImageArea (path); displayObject (a); } public void displayTable (string path) { TableArea a = new TableArea (path); displayObject (a); } public void displayChart (string path) { ChartArea a = new ChartArea (path); displayObject (a); } public void displayHtml (string path) { HtmlArea a = new HtmlArea (path); displayObject (a); }
Na záložku Tree přidáme informace o novém objektu * jako text ve stromu použijeme standardní konverzi obj.ToString (), kterou používá i sčítání řetězců znaků * do standardní položky node.Tag typu object schováme ukazatel na objekt
Pokud je objekt typu Control nebo třídy z Control odvozené,
umístíme objekt nad pictureBox.
BringToFront umístí objekt nad jiné plouvoucí panely, aby byl vidět
public void displayObject (object obj) { TreeNode node = new TreeNode (); node.Text = obj.ToString (); node.Tag = obj; tree.Nodes.Add (node); if (obj is Control) { Control c = obj as Control; c.Parent = pictureBox; c.BringToFront (); } }
private void tree_AfterSelect (object sender, TreeViewEventArgs e) { object obj = e.Node.Tag; propGrid.SelectedObject = obj; if (obj is Control) { Control c = obj as Control; c.BringToFront (); } }