| Autor |
Beitrag |
KostaK
      
Beiträge: 34
|
Verfasst: Mi 14.11.07 09:51
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
      
Beiträge: 72
WinXP,WinVista
Delphi(BDS2006, 5), C#(VS2005, BDS2006), VB6
|
Verfasst: 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 
      
Beiträge: 34
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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); } |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
KostaK 
      
Beiträge: 34
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 16.11.07 19:50
Jupp, genau!
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
KostaK 
      
Beiträge: 34
|
Verfasst: Fr 16.11.07 19:57
Alles klar,
Vielen Dank euch beiden, und nun ran an die Arbeit muß alles umschreiben.
Gruß Kosta
|
|
KostaK 
      
Beiträge: 34
|
Verfasst: 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.
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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 17.11.07 19:22
Musst Du nicht allDirectories rekursiv aufrufen, um alle (Unter)verzeichnisse zu erhalten?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
KostaK 
      
Beiträge: 34
|
Verfasst: 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.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: 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?
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
KostaK 
      
Beiträge: 34
|
Verfasst: 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 
      
Beiträge: 34
|
Verfasst: So 18.11.07 16:31
Hallo,
so ich habs, geht grob alles (minimale TreeView ohne Fehlerbehandlung).
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
|
|