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 ...
随机推荐
- 列表 & 元组& join & range
一:列表(增删改查,列表的嵌套,列表的循环) 1)增加 append (在列表的尾部增加) insert (插入) insert(插入的位置,插入的内容) extend ...
- 对Java代码加密的两种方式,防止反编译
使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...
- java框架之SpringMVC(2)-补充及拦截器
高级参数绑定 package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; i ...
- node Sream
const fs = require('fs'); let readerStream = fs.createReadStream('input.txt'); let writerStream = fs ...
- [CSS] Frequently used method or solutions for issues
Stick button in right side in html Solution: //In the html <div class="float__button" & ...
- JavaScript 常用数组函数方法专题
1. 由字符串生成数组 split() 分割字符串,并将分割的部分作为一个元素保存在一个新建的数组中. var str1 = "this is an emample to using the ...
- 构建 Owin 中间件 来获取客户端IP地址
Not so long ago, we discussed on this blog the possible ways of retrieving the client’s IP address i ...
- Unity之显示fps功能
如下: using UnityEngine; using System.Collections; public class ShowFpsOnGUI : MonoBehaviour { public ...
- java之webservice客户端
1.新建客户端项目. 2.配置服务端的wsdl文件位置 3.添加junit的jar包. 4.编写客户端类.
- Django简单实例
一.前戏-MVC框架与MTV框架 1.MVC MVC(Model View Controller),是一种软件工程开发的架构模式,不仅适用于软件开发,而且适用于其他广泛的设计和组织工作,主要思想通过分 ...