Winform中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)
場景
向窗體中拖拽照片并顯示效果
?
向窗體中拖拽文件夾并顯示樹形結構效果
?
注:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
新建一個窗體,在窗體中拖拽一個Panel控件,再在Panel控件上拖拽一個TreeView,然后再新增一個右鍵控件,添加兩個選項-拖放照片和拖放文件夾。
并分別設置兩個鼠標右鍵選項的Tag屬性分別為1和2。
?
Form1.Designer.cs代碼
private void InitializeComponent(){this.components = new System.ComponentModel.Container();this.panel_face = new System.Windows.Forms.Panel();this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);this.Tool_Ima = new System.Windows.Forms.ToolStripMenuItem();this.Tool_File = new System.Windows.Forms.ToolStripMenuItem();this.treeView1 = new System.Windows.Forms.TreeView();this.panel_face.SuspendLayout();this.contextMenuStrip1.SuspendLayout();this.SuspendLayout();//// panel_face//this.panel_face.ContextMenuStrip = this.contextMenuStrip1;this.panel_face.Controls.Add(this.treeView1);this.panel_face.Dock = System.Windows.Forms.DockStyle.Fill;this.panel_face.Location = new System.Drawing.Point(0, 0);this.panel_face.Name = "panel_face";this.panel_face.Size = new System.Drawing.Size(391, 238);this.panel_face.TabIndex = 0;this.panel_face.Visible = false;this.panel_face.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);//// contextMenuStrip1//this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.Tool_Ima,this.Tool_File});this.contextMenuStrip1.Name = "contextMenuStrip2";this.contextMenuStrip1.Size = new System.Drawing.Size(153, 70);//// Tool_Ima//this.Tool_Ima.Name = "Tool_Ima";this.Tool_Ima.Size = new System.Drawing.Size(152, 22);this.Tool_Ima.Tag = "1";this.Tool_Ima.Text = "拖放圖片";this.Tool_Ima.Click += new System.EventHandler(this.Tool_Ima_Click);//// Tool_File//this.Tool_File.Name = "Tool_File";this.Tool_File.Size = new System.Drawing.Size(152, 22);this.Tool_File.Tag = "2";this.Tool_File.Text = "拖放文件夾";this.Tool_File.Click += new System.EventHandler(this.Tool_Ima_Click);//// treeView1//this.treeView1.AllowDrop = true;this.treeView1.ContextMenuStrip = this.contextMenuStrip1;this.treeView1.Dock = System.Windows.Forms.DockStyle.Fill;this.treeView1.Location = new System.Drawing.Point(0, 0);this.treeView1.Name = "treeView1";this.treeView1.Size = new System.Drawing.Size(391, 238);this.treeView1.TabIndex = 0;this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick);this.treeView1.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);//// Form1//this.AccessibleRole = System.Windows.Forms.AccessibleRole.None;this.AllowDrop = true;this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(391, 238);this.ContextMenuStrip = this.contextMenuStrip1;this.Controls.Add(this.panel_face);this.Name = "Form1";this.Text = "向窗體中拖放圖片并顯示";this.DragEnter += new System.Windows.Forms.DragEventHandler(this.Form1_DragEnter);this.panel_face.ResumeLayout(false);this.contextMenuStrip1.ResumeLayout(false);this.ResumeLayout(false);}然后綁定兩個鼠標右鍵的點擊事件為同一個事件。
?private void Tool_Ima_Click(object sender, EventArgs e){SetDragHandle(sender, treeView1);}然后在點擊事件中調用方法SetDragHandle進行Panel或者TreeView的顯示控制。
Var_Style標識變量為true表示是拖拽照片模式,否則為拖拽文件夾模式。
public void SetDragHandle(object sender, TreeView TV){//獲取Tag標簽內容switch (Convert.ToInt16(((ToolStripMenuItem)sender).Tag.ToString())){case 1:{//讓面板隱藏panel_face.Visible = false;//設置標識變量為true,true表示是拖拽圖片模式Var_Style = true;break;}case 2:{this.Width = 399;this.Height = 272;panel_face.Visible = true;Var_Style = false;break;}}}兩個鼠標右鍵的點擊事件就是如上進行標識變量的設置,進而知道下一步要進行的操作是啥。
然后綁定panel和treeView以及窗體的拖拽事件為同一個事件
?
private void Form1_DragEnter(object sender, DragEventArgs e){//在窗體背景中顯示拖拽的照片SetDragImageToFrm(this, e);//清除treeView的所有節點treeView1.Nodes.Clear();//向TreeView控件添加被拖拽的文件夾的目錄SetDragImageToFrm(treeView1, e);}在拖拽事件中執行三個操作方法,分別為在窗體背景中顯示拖拽的照片的SetDragImageToFrm,清除treeView的
所有節點以及向treeView控件中添加被拖拽的文件夾的目錄。
在方法SetDragImageToFrm中,首先會根據是否是拖拽照片的標識變量進行判斷
如果是拖拽照片模式則獲取拖拽照片的路徑并將當前窗體的背景照片設置為拖拽的照片。
public void SetDragImageToFrm(Form Frm, DragEventArgs e){//如果顯示照片的標識變量為trueif (Var_Style == true){//設置拖放操作中目標放置類型為復制e.Effect = DragDropEffects.Copy;String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);string tempstr;Bitmap bkImage;//獲取拖拽圖片的路徑tempstr = str_Drop[0];try{bkImage = new Bitmap(tempstr);Frm.Size = new System.Drawing.Size(bkImage.Width + 6, bkImage.Height + 33);//設置當前窗體的背景圖片為拖拽的照片Frm.BackgroundImage = bkImage;}catch { }}}然后在重載方法SetDragImageToFrm中注意此時傳遞的參數不同,此時傳遞的參數是TreeView控件。
public void SetDragImageToFrm(TreeView TV, DragEventArgs e){//標識變量表示拖拽模式為文件夾if (Var_Style == false){e.Effect = DragDropEffects.Copy;String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);tempstr = str_Drop[0];//獲取拖放文件夾的目錄thdAddFile = new Thread(new ThreadStart(SetAddFile));?? //創建一個線程thdAddFile.Start(); //執行當前線程}}在上面的方法中獲取拖拽文件夾的目錄,然后創建一個線程并執行。
線程執行SetAddFile方法,在此方法中設置托管線程
public void SetAddFile(){this.Invoke(new AddFile(RunAddFile));//對指定的線程進行托管}在方法RunAddFile設置線程
?public void RunAddFile(){TreeNode TNode = new TreeNode();//實例化一個線程Files_Copy(treeView1, tempstr, TNode, 0);Thread.Sleep(0);//持起主線程thdAddFile.Abort();//執行線程?????}在上面方法中執行FIles_Copy方法顯示文件夾下所有文件夾和文件的名稱。
#region? 顯示文件夾下所有子文件夾及文件的名稱/// <summary>/// 顯示文件夾下所有子文件夾及文件的名稱/// </summary>/// <param Sdir="string">文件夾的目錄</param>/// <param TNode="TreeNode">節點</param>/// <param n="int">標識,判斷當前是文件夾,還是文件</param>private void Files_Copy(TreeView TV, string Sdir, TreeNode TNode, int n){DirectoryInfo dir = new DirectoryInfo(Sdir);try{if (!dir.Exists)//判斷所指的文件或文件夾是否存在{return;}DirectoryInfo dirD = dir as DirectoryInfo;//如果給定參數不是文件夾則退出if (dirD == null)//判斷文件夾是否為空{return;}else{if (n == 0){TNode = TV.Nodes.Add(dirD.Name);//添加文件夾的名稱TNode.Tag = 1;}else{TNode = TNode.Nodes.Add(dirD.Name);//添加文件夾里面各文件夾的名稱TNode.Tag = 1;}}FileSystemInfo[] files = dirD.GetFileSystemInfos();//獲取文件夾中所有文件和文件夾//對單個FileSystemInfo進行判斷,如果是文件夾則進行遞歸操作foreach (FileSystemInfo FSys in files){FileInfo file = FSys as FileInfo;if (file != null)//如果是文件的話,進行文件的復制操作{FileInfo SFInfo = new FileInfo(file.DirectoryName + "\\" + file.Name);//獲取文件所在的原始路徑TNode.Nodes.Add(file.Name);//添加文件TNode.Tag = 1;}else{string pp = FSys.Name;//獲取當前搜索到的文件夾名稱Files_Copy(TV, Sdir + "\\" + FSys.ToString(), TNode, 1);//如果是文件夾,則進行遞歸調用}}}catch (Exception ex){MessageBox.Show(ex.Message);return;}}#endregion完整示例代碼
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO;//添加的命名空間,對文件進行操作 using System.Threading;//線程序的命名空間namespace 向窗體中拖放圖片并顯示 {public partial class Form1 : Form{public Form1(){InitializeComponent();}public static bool Var_Style = true;public static string tempstr="";private System.Threading.Thread thdAddFile; //創建一個線程private System.Threading.Thread thdOddDocument; //創建一個線程public static TreeNode TN_Docu = new TreeNode();//單個文件的節點private static TreeView Tem_TView;/// <summary>/// 在窗體背景中顯示被拖放的圖片/// </summary>/// <param Frm="Form">窗體</param>/// <param e="DragEventArgs">DragDrop、DragEnter 或 DragOver 事件提供數據</param>public void SetDragImageToFrm(Form Frm, DragEventArgs e){//如果顯示照片的標識變量為trueif (Var_Style == true){//設置拖放操作中目標放置類型為復制e.Effect = DragDropEffects.Copy;String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);string tempstr;Bitmap bkImage;//獲取拖拽圖片的路徑tempstr = str_Drop[0];try{bkImage = new Bitmap(tempstr);Frm.Size = new System.Drawing.Size(bkImage.Width + 6, bkImage.Height + 33);//設置當前窗體的背景圖片為拖拽的照片Frm.BackgroundImage = bkImage;}catch { }}}/// <summary>/// 向TreeView控件添加被拖放的文件夾目錄/// </summary>/// <param TV="TreeView">TreeView控件</param>/// <param e="DragEventArgs">DragDrop、DragEnter 或 DragOver 事件提供數據</param>public void SetDragImageToFrm(TreeView TV, DragEventArgs e){//標識變量表示拖拽模式為文件夾if (Var_Style == false){e.Effect = DragDropEffects.Copy;String[] str_Drop = (String[])e.Data.GetData(DataFormats.FileDrop, true);tempstr = str_Drop[0];//獲取拖放文件夾的目錄thdAddFile = new Thread(new ThreadStart(SetAddFile));?? //創建一個線程thdAddFile.Start(); //執行當前線程}}public delegate void AddFile();//定義托管線程/// <summary>/// 設置托管線程/// </summary>public void SetAddFile(){this.Invoke(new AddFile(RunAddFile));//對指定的線程進行托管}/// <summary>/// 設置線程/// </summary>public void RunAddFile(){TreeNode TNode = new TreeNode();//實例化一個線程Files_Copy(treeView1, tempstr, TNode, 0);Thread.Sleep(0);//持起主線程thdAddFile.Abort();//執行線程?????}#region? 返回上一級目錄/// <summary>/// 返回上一級目錄/// </summary>/// <param dir="string">目錄</param>/// <returns>返回String對象</returns>public string UpAndDown_Dir(string dir){string Change_dir = "";Change_dir = Directory.GetParent(dir).FullName;return Change_dir;}#endregion#region? 顯示文件夾下所有子文件夾及文件的名稱/// <summary>/// 顯示文件夾下所有子文件夾及文件的名稱/// </summary>/// <param Sdir="string">文件夾的目錄</param>/// <param TNode="TreeNode">節點</param>/// <param n="int">標識,判斷當前是文件夾,還是文件</param>private void Files_Copy(TreeView TV, string Sdir, TreeNode TNode, int n){DirectoryInfo dir = new DirectoryInfo(Sdir);try{if (!dir.Exists)//判斷所指的文件或文件夾是否存在{return;}DirectoryInfo dirD = dir as DirectoryInfo;//如果給定參數不是文件夾則退出if (dirD == null)//判斷文件夾是否為空{return;}else{if (n == 0){TNode = TV.Nodes.Add(dirD.Name);//添加文件夾的名稱TNode.Tag = 1;}else{TNode = TNode.Nodes.Add(dirD.Name);//添加文件夾里面各文件夾的名稱TNode.Tag = 1;}}FileSystemInfo[] files = dirD.GetFileSystemInfos();//獲取文件夾中所有文件和文件夾//對單個FileSystemInfo進行判斷,如果是文件夾則進行遞歸操作foreach (FileSystemInfo FSys in files){FileInfo file = FSys as FileInfo;if (file != null)//如果是文件的話,進行文件的復制操作{FileInfo SFInfo = new FileInfo(file.DirectoryName + "\\" + file.Name);//獲取文件所在的原始路徑TNode.Nodes.Add(file.Name);//添加文件TNode.Tag = 1;}else{string pp = FSys.Name;//獲取當前搜索到的文件夾名稱Files_Copy(TV, Sdir + "\\" + FSys.ToString(), TNode, 1);//如果是文件夾,則進行遞歸調用}}}catch (Exception ex){MessageBox.Show(ex.Message);return;}}#endregionpublic void SetDragHandle(object sender, TreeView TV){//獲取Tag標簽內容switch (Convert.ToInt16(((ToolStripMenuItem)sender).Tag.ToString())){case 1:{//讓面板隱藏panel_face.Visible = false;//設置標識變量為true,true表示是拖拽圖片模式Var_Style = true;break;}case 2:{this.Width = 399;this.Height = 272;panel_face.Visible = true;Var_Style = false;break;}}}private void Form1_DragEnter(object sender, DragEventArgs e){//在窗體背景中顯示拖拽的照片SetDragImageToFrm(this, e);//清除treeView的所有節點treeView1.Nodes.Clear();//向TreeView控件添加被拖拽的文件夾的目錄SetDragImageToFrm(treeView1, e);}private void Tool_Ima_Click(object sender, EventArgs e){SetDragHandle(sender, treeView1);}private void Form1_Load(object sender, EventArgs e){Tem_TView = new TreeView();Tem_TView = treeView1;}string Tem_Dir = "";private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e){if (e.Node.Tag == null)Tem_Dir = "";elseTem_Dir = e.Node.Tag.ToString();if (Tem_Dir == ""){Tem_Dir = UpAndDown_Dir(tempstr) + "\\" + e.Node.FullPath;System.Diagnostics.Process.Start(@Tem_Dir);//打開當前文件}}} }
代碼下載
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/12027852
總結
以上是生活随笔為你收集整理的Winform中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Winform中实现拖拽文件到ListV
- 下一篇: Winform中实现自定义屏保效果(附代