场景

向窗体中拖拽照片并显示效果

向窗体中拖拽文件夹并显示树形结构效果

注:

博客主页:
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中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)相关推荐

  1. Winform中怎样跨窗体获取另一窗体的控件对象

    场景 Winform中实现跨窗体获取ZedGraph的ZedGraphControl控件对象: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/de ...

  2. C#【控件篇】Winform中使用MDI窗体

    C#-Winform中使用MDI窗体 窗体搭建及属性配置 代码部分 运行效果 其他学习参考 源码下载地址: 窗体搭建及属性配置 代码部分 运行效果 水平分布 层叠分布 显示当前打开的窗体 其他学习参考 ...

  3. ASP.NET的MVC中使用Cookie做身份验证(附代码下载)

    场景 ASP.NET的MVC中使用Session做身份验证(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1071 ...

  4. 【python】使用python脚本将CelebA中同一人的图片捡到对应单独的文件夹中

    1.目的 CelebA的所有的照片都在一个文件夹中,为了能在dlib训练人脸识别时,方便使用,将CelebA中同一人的图片捡到对应单独的文件夹中. [AI]CelebA数据介绍.下载及说明 2.方法 ...

  5. Ionic+Angular实现中英国际化(附代码下载)

    场景 Ionic介绍以及搭建环境.新建和运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106308166 在上面搭建起 ...

  6. JPA中实现双向多对多的关联关系(附代码下载)

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  7. xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...

    在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...

  8. Mac上显示出.m2文件夹并将IDEA中的Maven修改为阿里云镜像

    文章目录 1. 让Finder显示出.m2文件夹 1.1 方法一:快捷键 1.2 方法二:命令行 2. 在.m2文件夹下配置setting.xml 3. 在Intelij IDEA中进行设置 1. 让 ...

  9. 计算机基础中如何属性隐藏,-XP系统如何显示隐藏的文件夹

    -XP系统如何显示隐藏的文件夹 发布时间:2017-11-01 20:03 来源:互联网 当前栏目:电脑基础知识 随着互联网的日渐发达,对于信息的扩散也是日趋迅速,这也随之产生了一个弊端,就是信息隐私 ...

最新文章

  1. 慕课的原型图快速变html,分享一个html转换为pdf 利器 Pechkin
  2. python 图形界面文本处理_python3.6 +tkinter GUI编程 实现界面化的文本处理工具
  3. 谈谈产品开发团队的配置管理规则
  4. 机器学习实战-第二章代码+注释-KNN
  5. 余弦信号频谱表达式_2019年清华828信号与系统试题回忆
  6. java rmi接口 超时设置_Spring RMI客户端读超时设置 | 学步园
  7. 服务器系统和数据库,服务器系统和数据库
  8. 菜鸟学Linux - bash的配置文件
  9. 【数据结构和算法笔记】串详解:c实现
  10. 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表...
  11. 这篇文章让你搞懂 SpringMVC 国际化!
  12. igs无法分配驱动器映射表_CAD图纸字体不全怎么办?只要修改字体映射表就可以轻松解决了...
  13. java 实现微信搜索附近人功能
  14. 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16)
  15. android写日记app,写日记的app哪个好用 写日记的软件有哪些
  16. 爱因斯坦广义相对论:引力是时空的曲率
  17. 二维特征分类的基础_带你搞懂朴素贝叶斯分类算法
  18. 【CF833D】Red-Black Cobweb(点分治)
  19. 安卓手机怎么下载java游戏
  20. npm安装慢 ,卡在sill idealTree buildDeps不动

热门文章

  1. Lambda使用——JDK8新特性
  2. java对象数组覆盖_java – 如何覆盖RAML 1.0中的对象数组属性类型
  3. linux支持sshd救援模式,单用户、救援模式、克隆、两机互联
  4. 点击按钮出现图片_坪山电动车上牌丨部分手机点击拍摄按钮,页面没有反应,无法拍摄人脸图片或上传照片,为什么?...
  5. centos 安装ftp FileZilla
  6. windows 下常用命令行
  7. android 底部通知,Android Fragment实现底部通知栏
  8. python sql 日期查询_Python--flask使用 SQLAlchemy查询数据库最近时间段或之前的数据...
  9. python截取子串_python获得子串
  10. linux分区dh满了,python 在linux下能过top,和dh命令获得cpu,内存,以及硬盘信息 - Sprite...