Hallo ihr Coder's
In letzter Zeit haben sich X-Threads um das Thema TreeView und Dateistruktur gehandelt. Da scheinbar ein Bedarf besteht habe ich so einen TreeView zusammengeschraubt und stelle ihn zur Verfügung.
Der TreeView basiert übrigens auf dem LoadOnDemandTreeView den ich früher schon mal gepostet habe (siehe Verzögertes Laden von Daten im TreeView).
Die LoadOnDemandTreeView-Klasse:
using System;
using System.Windows.Forms;
namespace FileTreeView
{
public class LoadOnDemandTreeView:TreeView
{
private bool _blnFakeNodes=true;
public LoadOnDemandTreeView()
{
}
public bool FakeNodes
{
get{return this._blnFakeNodes;}
set{this._blnFakeNodes=value;}
}
public bool FakeNode(TreeNode pTreeNodeToFake)
{
bool ret=false;
if (pTreeNodeToFake!=null && !pTreeNodeToFake.IsExpanded && pTreeNodeToFake.Nodes.Count==0)
{
TreeNode ndFake=new TreeNode("fake");
ndFake.Tag="fake";
pTreeNodeToFake.Nodes.Add(ndFake);
ret=true;
}
return ret;
}
protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
{
if(_blnFakeNodes && e.Node.Nodes.Count>0 && e.Node.Nodes[0].Tag!=null && e.Node.Nodes[0].Tag.ToString()=="fake" )
{
e.Node.Nodes.Clear();
this.OnLoadData(e);
}
base.OnBeforeExpand (e);
}
protected override void OnAfterCollapse(TreeViewEventArgs e)
{
base.OnAfterCollapse (e);
if (_blnFakeNodes)
{
e.Node.Nodes.Clear();
TreeNode ndFake=new TreeNode("fake");
ndFake.Tag="fake";
e.Node.Nodes.Add(ndFake);
}
}
protected virtual void OnLoadData(TreeViewCancelEventArgs e)
{
if (this.LoadData!=null)
{
this.LoadData(this,e);
}
}
public event TreeViewCancelEventHandler LoadData;
}
}
Die von LoadOnDemandTreeView vererbende Klasse DirectoryTreeViewOnDemand:
using System;
using System.IO;
using System.Windows.Forms;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Drawing;
namespace FileTreeView
{
public class DirectoryTreeViewOnDemand : LoadOnDemandTreeView, ISupportInitialize
{
#region Constructor
public DirectoryTreeViewOnDemand()
{
}
#endregion
#region Properties
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new TreeNodeCollection Nodes
{
get{return base.Nodes;}
}
#endregion
#region Methods
protected override void OnLoadData(TreeViewCancelEventArgs e)
{
base.OnLoadData (e);
if (e.Action==TreeViewAction.Expand)
{
try
{
DirectoryInfo dirInfo=new DirectoryInfo(e.Node.FullPath);
if (dirInfo!=null)
{
foreach (FileSystemInfo fsi in dirInfo.GetFileSystemInfos())
{
Type t=fsi.GetType();
if (t==typeof(DirectoryInfo))
{
DirectoryInfo di=(DirectoryInfo)fsi;
TreeNode nd=new TreeNode(di.Name);
if (this.ImageList!=null && this.ImageList.Images.Count>1)
{
//Default Index für Directory
nd.ImageIndex=1;
nd.SelectedImageIndex=1;
}
this.FakeNode(nd);
e.Node.Nodes.Add(nd);
}
else if(t==typeof(FileInfo))
{
FileInfo fi=(FileInfo)fsi;
TreeNode nd=new TreeNode(fi.Name);
if (this.ImageList!=null && this.ImageList.Images.Count>2)
{
//Default Index für File
nd.ImageIndex=2;
nd.SelectedImageIndex=2;
}
e.Node.Nodes.Add(nd);
}
}
}
}
catch
{
e.Cancel=true;
this.FakeNode(e.Node);
}
}
}
#endregion
#region ISupportInitialize Members
public void BeginInit()
{
this.Nodes.Clear();
}
public void EndInit()
{
foreach (string drive in Directory.GetLogicalDrives())
{
TreeNode ndDrive=new TreeNode(drive);
if (this.ImageList!=null && this.ImageList.Images.Count>0)
{
//Default Index für Drive
ndDrive.ImageIndex=0;
ndDrive.SelectedImageIndex=0;
}
this.FakeNode(ndDrive);
this.Nodes.Add(ndDrive);
}
}
#endregion
}
}
Sample Code ?? brauchts keinen, da man nix coden muss.
Das einzige was noch schön ist: Eine ImageList auf das Form auf welchem man den TreeView verwendet ziehen und 3 Images einfügen
ImageIndex0 = Laufwerksicon
ImageIndex1 = Verzeichnisicon
ImageIndex2 = FileIcon
Programmierhans
Edit: Nachtrag
In der Verwendung kann man z.B: die Anwendung öffnen oder ein Bitmap oder was auch immer...
TreeNode nd=this.directoryTreeViewOnDemand1.GetNodeAt (this.directoryTreeViewOnDemand1.PointToClient (Cursor.Position));
try
{
Process.Start(nd.FullPath);
}
catch{}
}
So kann man Files aus dem Tree rausziehen (Kopiert die physikalische Datei)
private void directoryTreeViewOnDemand1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
TreeNode nd=this.directoryTreeViewOnDemand1.GetNodeAt (this.directoryTreeViewOnDemand1.PointToClient (Cursor.Position));
if (nd!=null)
{
DataObject da=new DataObject(DataFormats.FileDrop,new string[]{nd.FullPath});
this.directoryTreeViewOnDemand1.DoDragDrop(da,DragDropEffects.All | DragDropEffects.Copy);
}
}
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Cool, langsam kommen immer mehr Quellcodes zusammen!
mfg,
SimonKnight6600
Hallo Hans
Vielen Dank für deinen Beitrag hier.
Ich kann das Ding gut gebrauchen.
Vorallem hast du es schön generisch gehalten.
edit: Das geniale dabei ist auch noch, dass man dann keine rekursive Funktion
mehr braucht 🙂
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011