Winform中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)

article/2025/9/23 19:54:11

场景

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

 

 

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

 

 

注:

博客主页:
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


http://chatgpt.dhexx.cn/article/41RV39bP.shtml

相关文章

Day 21-30 :Web前端概述

Web前端概述 说明&#xff1a;本文使用的部分插图来自Jon Duckett先生的*HTML and CSS: Design and Build Websites*一书&#xff0c;这是一本非常棒的前端入门书&#xff0c;有兴趣的读者可以在亚马逊或者其他网站上找到该书的购买链接。 HTML 是用来描述网页的一种语言&#…

托管 AJAX 能否让 Web 应用程序提速?

有关本主题的多项研究表明&#xff0c;创建 AJAX Web 应用程序时遇到的两个最重要问题是&#xff0c;运行速度和响应速度。这可能是一些开发者选择创建原生应用程序&#xff08;而不是 Web 应用程序&#xff09;的部分原因所在。 但如果我说有一种方法可以创建运行速度和响应速…

数据库实验代码展示(图书管理系统)

数据库实验视频演示及讲解地址 namespace BookManageSystem {partial class Add_BookInfo{/// <summary>/// Required designer variable./// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// Clean up any resou…

【C#】利用C#窗体与SQL Server的连接、Treeview制作SQL Server数据库查看器

实质上&#xff0c;本文的中心还是在讨论C#对SQL Server的增删改查&#xff0c;只是这次创新一点&#xff0c;配合Treeview制作SQL Server数据库查看器。 具体如下图&#xff1a; 根据SQL Server&#xff0c;Test数据库中的表的结构与内容&#xff1a; 编写一个对Test数据库的…

获取文件夹内文件名字及源代码C#

获取文件夹内文件名字及源代码C# using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks…

TreeView控件与SQL数据库的应用(遍历算法)

开发环境&#xff1a;WinXP SP3&#xff0c;VS2008&#xff0c;SQL2000 TreeView控件与SQL数据库的应用(遍历算法) (数据与TreeView的绑定及Treeview的增加、删除、修改、遍历等数据库的操作) 这个是数据库连接及一些操作数据库的方法&#xff0c;文件&#xff1a;SqlManager.c…

TreeView数据绑定

http://www.cnblogs.com/mgen/archive/2011/07/21/2113152.html [更新至V2]WPF&#xff1a;MVVM简单文件浏览器 源代码下载 2.0 下载页面 1.0 下载页面 注意&#xff1a;链接是微软SkyDrive页面&#xff0c;下载时请用浏览器直接下载&#xff0c;用某些下载工具可能无法下载 源…

C#界面设计之树目录TreeView的使用

还是先上效果图&#xff1a; 主要代码如下&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms;namespace TreeDemo {public partial c…

treeview 跨窗体拖拽功能的实现(一)

功能实现&#xff1a; 1.从工具窗体往任务窗体拖拽&#xff1b; 2.在任务窗体中改变节点的顺序&#xff1b; 3.右键复制节点&#xff0c;删除节点 工具窗体treeview1,&#xff1a; 涉及使用的事件&#xff1a;DragEnter&#xff0c; DragOver ,ItemDrag, NodeMouseDouble…

Virtual Treeview 安装以及入门

Virtual Treeview是一套Delphi下优秀的VCL控件&#xff0c;代码质量高&#xff0c;使用灵活、功能强大、性能非常好&#xff0c;可以用于表达Treeview和表格类数据。它的代码现在托管在google code上。 Virtual Treeview是一个“纯VCL”控件&#xff0c;这意味着它不是基于任何…

android treeview 树形结构,前端开发中,使用TreeView控件创建树形结构

原标题&#xff1a;前端开发中&#xff0c;使用TreeView控件创建树形结构 Wijmo是一款使用Type编写的新一代Java/HTML5控件集。它秉承触控优先的设计理念&#xff0c;在全球率先支持AngularJS&#xff0c;并提供性能卓越、零依赖的FlexGrid和图表等多个控件。 我们已经知道在Wi…

透透彻彻了解服务器技术

什么是服务器   服务器是一种高性能计算机&#xff0c;作为网络的节点&#xff0c;存储、处理网络上80&#xff05;的数据、信息&#xff0c;因此也被称为网络的灵魂。做一个形象的比喻&#xff1a;服务器就像是邮局的交换机&#xff0c;而微机、笔记本、PDA、手机等固定或移…

服务器的介绍

一 、IDC/机柜/物理server/云主机介绍 1.互联网数据中心 &#xff08;Internet Data Center&#xff09; 互联网数据中心图片 &#xff08;1&#xff09;IDC的简介 简称IDC&#xff0c;是电信部门利用已有的互联网通信线路、带宽资源&#xff0c;建立的标准化电信专业级机房环…

web服务器(技术讲解)

2.Web服务器&#xff08;技术讲解&#xff09; 1.ASP 微软&#xff1a;国内最早流行在HTML中嵌入了VB脚本&#xff0c;ASPCOM在ASP开发中&#xff0c;基本一个页面有几千行的业务代码&#xff0c;页面杂乱&#xff0c;维护成本非常高 2.PHP 开发速度很快&#xff0c;功能强…

关于服务器

初始服务器 云操作 以下是重装系统操作 出现黑窗口后&#xff1a; 输入—>sudo passwd命令–>输入密码&#xff08;密码不可见&#xff09;–>再次输入密码&#xff08;密码不可见&#xff09;–>su命令&#xff08;可使用root用户&#xff09;–>输入密码&…

云服务器简介

云服务器简介 一、云服务器二、云服务的灵魂——虚拟化三、云服务器ECS概念 一、云服务器 1、云服务器简介 云计算服务器又称为云服务器或云主机&#xff0c;是云计算服务体系中的一项主机产品&#xff0c;它有效地解决了传统物理主机与VPS服务中&#xff0c;存在的管理难度打…

服务器概述

1、什么是服务器&#xff1f; 服务器&#xff1a;分为服务器硬件和服务器软件。在硬件服务器&#xff08;计算机&#xff09;上安装服务器软件&#xff0c;才可以对外提供服务。 比如&#xff1a;让其他的计算机访问当前服务器&#xff0c;为其他的计算机提供服务。 &#xff…

服务器技术(三)--Nginx

Nginx介绍 Nginx是什么、适用场景 Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好。 Nginx专为性能优化而开发&#xff0c;性能是其最重要的考量&#xf…

2022年,服务器领域十大技术趋势

2020年&#xff0c;疫情的全球爆发对上半年服务器市场的出货量带来了不小的影响。但是随着下半年疫情逐渐得到控制以及数字化需求的激增&#xff0c;全球服务器市场呈现出非常不错的增长态势。 目前来看&#xff0c;服务器依然是数字化转型和云计算、互联网等技术发展基础&…

服务器端技术

简介&#xff1a; 服务器分为web服务器和应用服务器。Web服务器是离客户端最近的服务器&#xff0c;负责监听和处理HTTP请求。应用服务器比web服务器更靠近后端&#xff0c;主要处理复杂的业务逻辑和数据库的访问。 如果是静态资源&#xff08;例如HTML页面或图片&#xff09;…