Laden...

FileTreeView

Erstellt von Programmierhans vor 18 Jahren Letzter Beitrag vor 17 Jahren 12.454 Views
Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren
FileTreeView

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

S
709 Beiträge seit 2005
vor 18 Jahren

Cool, langsam kommen immer mehr Quellcodes zusammen!
mfg,
SimonKnight6600

5.942 Beiträge seit 2005
vor 17 Jahren

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