C# 获取往控件中拖进的文件或文件夹的信息
在做C#的WinForm开发的时候,有时需要用户往指定的控件中拖进文件或者文件夹。然后根据用户拖进来的文件或者文件夹获取其信息并进行下一步操作。
网络中百度或者谷歌一下有很多相关文章进行说明,不过很多都是不得的,或者说没有达到你所要的要求。刚好我这阵子弄一个东西需要到这样的操作,下面我们来探讨一下具体怎么实现。
实际上任何包含有AllowDrop属性的控件都会有对应的四个拖动事件:DragDrop、DragEnter、DragLeave和DragOver。
相关说明:
DragDrop:拖放操作完成时发生。
DragEnter:在将对象拖入控件的边界时发生。
DragLeave:在将对象拖出控件的边界时发生。
DragOver:在将对象拖到控件的边界上发生。
如果你不想在一拖动东西刚刚进到控件就触发事件,而是希望等你放开鼠标之后再触发。那你就不能使用DragEnter事件,而应该使用DragDrop事件。
事实是:设置控件的AllowDrop属性为true之后,你双击控件的DragDrop事件,进入到事件的代码区,你会发现不管你拖动任何东西到控件中去,都不会触发DragDrop事件。
同时,如果你双击控件的DragEnter事件,你拖动任何东西进去都会触发该事件。你设断点跟踪一下即可发现一下情况:

你如果在DragEnter事件中更改DragEventArgs委托类型的参数e.Effect属性,比如,在DragEnter事件中写:
private void listView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.None;//(使用DragEventArgs类型参数的Effect属性来设定所允许的置放操作。只要不是:e.Effect = DragDropEffects. None,其它都可以,这里的目的是触发DragDrop事件。)
}
此时你往控件中拖动任何东西的时候都会触发DragDrop事件。这个时候你就可以把东西拖动进控件后,等你放开鼠标了才进行你想要的操作。这里涉及到.Net事件模型的运行机制。你可以通过更改同一个对象的(即控件,这里的例子用到的是ListView控件)DragEventArgs委托类型参数来实现触发同一个对象的其他事件。
以下是我写的小例程,当拖动进来的是文件(或者文件夹)的时候,就弹出消息框,消息框内容显示拖动进来的文件(或者文件夹)的路径信息。当拖动进来的是文本内容的时候,label2控件就显示文本内容信息。
private void listView1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Link;
}
else if (e.Data.GetDataPresent(DataFormats.Text))
{
e.Effect = DragDropEffects.Copy;
}
}
private void listView1_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string str = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
MessageBox.Show(str, "提示信息", MessageBoxButtons.OK);
}
else if (e.Data.GetDataPresent(DataFormats.Text))
{
label2.Text = (e.Data.GetData(DataFormats.Text)).ToString();
}
}
C# 获取往控件中拖进的文件或文件夹的信息的更多相关文章
- UGUI 之获取当前控件的高度
当Canvas Scaler选择Constant Pixel Size 当前的分辨率会被被固定,可以用RectTransform类里面的.rect变量值获取 height或Width. 在次情况下获取 ...
- winfrom获取用户控件里的控件对象
如何获取用户控件里的控件对象呢,其实思路也是很简单的, 比如有一个panel 用户控件 里面有许多的其他控件. 那么要找出一个Label控件怎么找呢,好的.现在我们就开始 首先,一个foreach循环 ...
- 获取android控件的高度
问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ...
- .net获取select控件中的文本内容
.net获取select控件中的文本内容 2009-11-28 21:19小V古 | 分类:C#/.NET | 浏览1374次 <select id="SecType" st ...
- JS获取用户控件中的子控件Id
用户控件 <asp:HiddenField ID="hfGradeId" runat="server" /> <asp:HiddenField ...
- 获取Repeater控件中的每一项数据
var items = rptList.Items;//获取Repeater控件的所有项 foreach (RepeaterItem item in items)//遍历每一项内容 { var t ...
- JS 获取Button控件的提交类型
<script type="text/javascript"> <!--获取button控件的类型---> function isAuditOrCancel ...
- WPF:获取DataGrid控件单元格DataGridCell
转载:http://blog.csdn.net/jhqin/article/details/7645357 /* ------------------------------------------- ...
- WPF获取原始控件样式。
要获取WPF控件的原始样式,需要我们安装Blend for Visual Studio. 然后,我们打开Blend for Visual Studio,创建一个WPF项目. 然后,我们向页面拖动一个B ...
随机推荐
- layui中的submit提交本地数据在控制在输出为空数组(解决)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux下yum安装及配置
1 2 3 4 分步阅读 公司使用的是linux搭建服务器,linux安装软件能够使用yum安装依赖包是一件非常简单而幸福的事情,所以这里简单介绍一下linux安装yum源流程和操作. 工具/原料 电 ...
- 编写自定义django-admin命令
Django为项目中每一个应用下的management/commands目录中名字没有以下划线开始的Python模块都注册了一个manage.py命令,我们可以利用这点来自定制一个命令(比如运行该命令 ...
- day014 模块
# 1.用于多种语言交互 编程语言通用数据 # 内置的 不需要安装 直接导入使用 import json # 导入一个json模块 # dumps loads# dump load 有持久化的功能 # ...
- (转)Docker容器的重启策略及docker run的--restart选项详解
1. Docker容器的重启策略 Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略. Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关. ...
- 抓取html 生成图片
<!DOCTYPE html> <html> <head> <script type="text/javascript" ...
- 在服务器上搭建node环境
一般公司的发布是后台人员完成的,但是作为开发不会发布项目还是有点不高级的感觉 因为没有搭建虚拟机于是就直接在我阿里云的服务器上搭建了node环境, 第一步,前往node官网下载linux下的阿里云的镜 ...
- js事件冒泡和事件捕捉
结论:他们是描述事件触发时序问题的术语.事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件冒泡是自下而上的去触发事件.绑定事件方法的第三个参数,就是控制事件触发 ...
- “流式”前端构建工具——gulp.js 简介
Grunt 一直是前端领域构建工具(任务运行器或许更准确一些,因为前端构建只是此类工具的一部分用途)的王者,然而它也不是毫无缺陷的,近期风头正劲的 gulp.js 隐隐有取而代之的态势.那么,究竟是什 ...
- sql 身份证计算年龄和性别
IdentityNumber 是身份证号 年龄: ,), GETDATE()) / 365.25) as '推荐人年龄', 15位的身份证计算年龄: case when b.IdentityNumbe ...