Autor Beitrag
KostaK
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 72

WinXP,WinVista
Delphi(BDS2006, 5), C#(VS2005, BDS2006), VB6
BeitragVerfasst: Fr 16.11.07 14:34 
Hi,

was hälst du von:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

ausblenden 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"); // "foo" wird angezeigt
            tn.Tag = "e:\\foo\\"//"e:\foo\" unsichtbar gespeichert

            treeView1.Nodes.Add(tn);
        }

        private void treeView1_DoubleClick(object sender, EventArgs e)
        {
            MessageBox.Show((string)treeView1.SelectedNode.Tag); // "e:\foo\" anzeigen
        }

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
KostaK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 16.11.07 19:50 
Jupp, genau!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
KostaK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Fr 16.11.07 19:57 
Alles klar,

Vielen Dank euch beiden, und nun ran an die Arbeit muß alles umschreiben.

Gruß Kosta
KostaK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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.

ausblenden volle Höhe 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(21) + ")";
                }
                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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: So 18.11.07 16:31 
Hallo,
so ich habs, geht grob alles (minimale TreeView ohne Fehlerbehandlung).

ausblenden volle Höhe 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(System.Environment.MachineName);
            treeView1.Nodes.Add("Arbeitsplatz");
            TreeNode Node;
            foreach (DriveInfo Laufwerk in System.IO.DriveInfo.GetDrives())
            {
                string VolumeLabel = "";
                string LaufwerkName = " (" + Laufwerk.Name.Remove(21) +")";
                Node = new TreeNode();
                if (Laufwerk.IsReady)
                {
                    Node.Text = Laufwerk.VolumeLabel + LaufwerkName;
                }
                else
                { 
                    switch (Laufwerk.DriveType)
                    {
                        case DriveType.CDRom:
                            VolumeLabel = "CD-DVD-Laufwerk" + LaufwerkName;
                            //ImageIndex = DVDDrive;
                            break;
                        case DriveType.Fixed:
                            VolumeLabel = Laufwerk.VolumeLabel + LaufwerkName;
                            //ImageIndex = FixedDrive;
                            break;
                        case DriveType.Network:
                            VolumeLabel = "Netzlaufwerk" + LaufwerkName;
                            //ImageIndex = NetzDrive;
                            break;
                        case DriveType.Ram:
                            VolumeLabel = "Ramlaufwerk" + LaufwerkName;
                            break;
                        case DriveType.Removable:
                            VolumeLabel = "Wechseldatenträger" + LaufwerkName;
                            //ImageIndex = RemovableDrive;
                            break;
                        case DriveType.Unknown:
                            VolumeLabel = "Unbekant" + LaufwerkName;
                            //ImageIndex = UnknownDrive;
                            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);
                //rekursiv alle Verzeichnisse
                //allDirectories(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