Winform中实现向窗体中拖放照片并显示以及拖放文件夹显示树形结构(附代码下载)
场景
向窗体中拖拽照片并显示效果
向窗体中拖拽文件夹并显示树形结构效果
注:
博客主页:
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
新建一个窗体,在窗体中拖拽一个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) { //如果显示照片的标识变量为true if (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) { //如果显示照片的标识变量为true if (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; } } #endregion 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; } } } 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 = ""; else tem_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
上一篇: 多任务的使用模式