Entwickler-Ecke
WinForms - TreeView Bezeichnung der Laufwerke
KostaK - Mi 14.11.07 09:51
Titel: TreeView Bezeichnung der Laufwerke
Hallo an alle,
ich bin hier neu im Forum, seid gegrüßt.
Folgende Frage, die mich seit einiger Zeit beschäftigt:
wie wird in den nodes der TreeView die Laufwerksbezeichnung eingefügt (z.B: DVD-Laufwerk)?
Wie man die Bezeichnung bekommt weiß ich. In der Text Eigenschaft kann man es ja nicht, da später durch FullPath zugegriffen wird um die Verzeichnisse zu erhalten. In der Name auch nicht da später nicht zugegriffen werden kann.
Es muss doch eine logische Möglichkeit geben, die TreeView wie den Explorer ausehen zu lassen mit Laufwerksbezeichnung, und nicht nur mit C:\ oder D:\ sondern so "DVD-Laufwerk(E)"
Gruß Kosta
John Sanson - Fr 16.11.07 14:34
Hi,
was hälst du von:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| using System.IO;
private void button1_Click(object sender, EventArgs e) { TreeNode Node = new TreeNode(); foreach (DriveInfo Laufwerk in System.IO.DriveInfo.GetDrives()) { Node = new TreeNode(); if (Laufwerk.IsReady) { Node.Text = Laufwerk.VolumeLabel + " (" + Laufwerk.Name + ")"; } else { Node.Text = Laufwerk.DriveType.ToString() + " (" + Laufwerk.Name + ")"; } Node.Tag = Laufwerk.Name; treeView1.Nodes[0].Nodes.Add(Node); } } |
Gruß
Chris
PS: Es wird eine Root-Node benötigt (Z.B. eine die Laufwerke heißt), darunter befinden sich dann die Laufwerke).
KostaK - Fr 16.11.07 19:16
Hallo Chris,
du schreibst alles in Node.Text so wie ich(und es funktioniert nicht). Nacher muß ja Node an eine Funktion übergeben werden als Basis um die Verzeichnisse zu suchen. Also steht in Node.Text = "CD-Rom(F)" oder so etwas, also das was in der View gut aussieht und auch so sein soll aber nicht C:\ das was verlangt wird. Wenn ich also mit Node.FullPath versuche nach dem Root zuzgreifen steht "CD-Rom(F)\Windows\... und nicht C:\Windows\... und das kann nicht gehen. Ich bin am Ende.
Danke
Gruß Kosta
Christian S. - Fr 16.11.07 19:35
Ein TreeNode hat die Tag-Eigenschaft, die vom Programmierer mit beliebigen Daten gefüllt werden kann. Also z.B. so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void Form1_Load(object sender, EventArgs e) { TreeNode tn = new TreeNode("foo"); tn.Tag = "e:\\foo\\"; treeView1.Nodes.Add(tn); }
private void treeView1_DoubleClick(object sender, EventArgs e) { MessageBox.Show((string)treeView1.SelectedNode.Tag); } |
KostaK - Fr 16.11.07 19:47
Hallo,
das bedeutet ich muß die Tag Eigenschaft der Node mit den richtigen Werten füllen und die Text mit denen die angezeigt werden sollen und dann auf die Tag zugreifen um die verzeichnisse zu bekommen.
richtig ?
Gruß Kosta
Christian S. - Fr 16.11.07 19:50
Jupp, genau!
KostaK - Fr 16.11.07 19:57
Alles klar,
Vielen Dank euch beiden, und nun ran an die Arbeit muß alles umschreiben.
Gruß Kosta
KostaK - Sa 17.11.07 17:52
Hallo Jungs,
ich hab noch irgendwo einen Fehler in der Probeanwendung. Die ersten Verzeichnisse, also nach C: oder D: werden angezeigt und der Rest nicht. Diese Tag Geschichte macht mich fertig.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| public Form1() { InitializeComponent(); PopTreeView(); } private void PopTreeView() { treeView1.Nodes.Add("Arbeitsplatz");
TreeNode Node; foreach (DriveInfo Laufwerk in System.IO.DriveInfo.GetDrives()) { Node = new TreeNode(); if (Laufwerk.IsReady) { Node.Text = Laufwerk.VolumeLabel + " (" + Laufwerk.Name.Remove(2,1) + ")"; } else { Node.Text = Laufwerk.DriveType.ToString() + " (" + Laufwerk.Name.Remove(2, 1) + ")"; } Node.Tag = Laufwerk.Name; treeView1.Nodes[0].Nodes.Add(Node); allDirectories(Node); } } private void allDirectories(TreeNode node) { DirectoryInfo[] arrDirInfo; DirectoryInfo dirinfo; try { dirinfo = new DirectoryInfo((string)node.Tag); arrDirInfo = dirinfo.GetDirectories(); } catch { return; }
foreach (DirectoryInfo info in arrDirInfo) { node.Nodes.Add(info.Name); node.Tag = info.Name; } } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Node.Nodes.Count == 0) allDirectories(e.Node); } |
Gruß Kosta
Christian S. - Sa 17.11.07 19:22
Musst Du nicht allDirectories rekursiv aufrufen, um alle (Unter)verzeichnisse zu erhalten?
KostaK - Sa 17.11.07 19:42
Hallo Christian,
in AfterSelect oder BeforeExpand, nicht rekursiv sonst muß ich ja ne halbe Stunde warten bis alle verzeichnisse auf dem Rechner durchsucht worden sind. Macht man doch nicht, oder?
Ich hab den Code vom John genommen zum probieren wegen der erwähnten Tag Sache.
Gruß Kosta
Christian S. - Sa 17.11.07 19:49
Ah, das mit dem AfterSelect hatte ich übersehen. Wie man das macht kommt auf die Anwendung an, liest man die Verzeichnisse vorher ist's natürlich zur Laufzeit schneller, aber man hat am Anfang eine Wartezeit.
Aber: Wenn ich das richtig sehe, werden die Unterknoten erst hinzugefügt, wenn ich den Knoten markiere. Das heisst, ich habe vorher auc kein "+" davor stehen. Finde ich nicht sehr intuitiv. Ich würde also immer eine Ebene im voraus laden, sodass die "+" schon da stehen.
Hast Du den Quelltext mal debuggt? Also im Einzelschritt durchgegangen, was passiert, wenn Du einen Unterknoten anklickst?
KostaK - Sa 17.11.07 20:11
Hallo,
also wegen dem plus Zeichen da hast du Recht, ist überhaupt nicht intuitiv. Ist aber nur ne Testanwendung zum üben, muß mich noch reinknien TreeView ist noch Neuland.
Beim Unterknoten anklicken geht nix.
Gruß Kosta
KostaK - So 18.11.07 16:31
Hallo,
so ich habs, geht grob alles (minimale TreeView ohne Fehlerbehandlung).
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO;
namespace meineTreeView { public partial class meineTreeView : Form { public meineTreeView() { InitializeComponent(); PopTreeView(); } private void PopTreeView() { treeView1.Nodes.Add("Arbeitsplatz"); TreeNode Node; foreach (DriveInfo Laufwerk in System.IO.DriveInfo.GetDrives()) { string VolumeLabel = ""; string LaufwerkName = " (" + Laufwerk.Name.Remove(2, 1) +")"; Node = new TreeNode(); if (Laufwerk.IsReady) { Node.Text = Laufwerk.VolumeLabel + LaufwerkName; } else { switch (Laufwerk.DriveType) { case DriveType.CDRom: VolumeLabel = "CD-DVD-Laufwerk" + LaufwerkName; break; case DriveType.Fixed: VolumeLabel = Laufwerk.VolumeLabel + LaufwerkName; break; case DriveType.Network: VolumeLabel = "Netzlaufwerk" + LaufwerkName; break; case DriveType.Ram: VolumeLabel = "Ramlaufwerk" + LaufwerkName; break; case DriveType.Removable: VolumeLabel = "Wechseldatenträger" + LaufwerkName; break; case DriveType.Unknown: VolumeLabel = "Unbekant" + LaufwerkName; break; default: break; } Node.Text = VolumeLabel; } Node.Tag = Laufwerk.Name; treeView1.Nodes[0].Nodes.Add(Node); allDirectories(Node); } } private void allDirectories(TreeNode node) { DirectoryInfo[] arrDirInfo; DirectoryInfo dirinfo; try { dirinfo = new DirectoryInfo((string)node.Tag); arrDirInfo = dirinfo.GetDirectories(); } catch { return; }
foreach (DirectoryInfo info in arrDirInfo) { TreeNode tempNode = new TreeNode(); tempNode.Text = info.Name; tempNode.Tag += node.Tag + "\\" + info.Name; node.Nodes.Add(tempNode); } }
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Node.Nodes.Count == 0) allDirectories(e.Node);
e.Node.Expand(); try { listView1.Items.Clear(); string[] files = Directory.GetFiles((string)e.Node.Tag);
foreach (string file in files) { listView1.Items.Add(Path.GetFullPath(file), Path.GetFileName(file), "1"); } }catch { } }
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) { foreach (TreeNode node in e.Node.Nodes) { if (node.Nodes.Count == 0) allDirectories(node); } }
private void listView1_DoubleClick(object sender, EventArgs e) { try { System.Diagnostics.Process.Start(@listView1.SelectedItems[0].Name); } catch { } } } } |
nochmal Danke an alle die mir geholfen haben.
Gruß Kosta
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!