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# 获取往控件中拖进的文件或文件夹的信息的更多相关文章

  1. UGUI 之获取当前控件的高度

    当Canvas Scaler选择Constant Pixel Size 当前的分辨率会被被固定,可以用RectTransform类里面的.rect变量值获取 height或Width. 在次情况下获取 ...

  2. winfrom获取用户控件里的控件对象

    如何获取用户控件里的控件对象呢,其实思路也是很简单的, 比如有一个panel 用户控件 里面有许多的其他控件. 那么要找出一个Label控件怎么找呢,好的.现在我们就开始 首先,一个foreach循环 ...

  3. 获取android控件的高度

    问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ...

  4. .net获取select控件中的文本内容

    .net获取select控件中的文本内容 2009-11-28 21:19小V古 | 分类:C#/.NET | 浏览1374次 <select id="SecType" st ...

  5. JS获取用户控件中的子控件Id

    用户控件 <asp:HiddenField ID="hfGradeId" runat="server" /> <asp:HiddenField ...

  6. 获取Repeater控件中的每一项数据

    var items = rptList.Items;//获取Repeater控件的所有项 foreach (RepeaterItem item in items)//遍历每一项内容 {   var t ...

  7. JS 获取Button控件的提交类型

    <script type="text/javascript"> <!--获取button控件的类型---> function isAuditOrCancel ...

  8. WPF:获取DataGrid控件单元格DataGridCell

    转载:http://blog.csdn.net/jhqin/article/details/7645357 /* ------------------------------------------- ...

  9. WPF获取原始控件样式。

    要获取WPF控件的原始样式,需要我们安装Blend for Visual Studio. 然后,我们打开Blend for Visual Studio,创建一个WPF项目. 然后,我们向页面拖动一个B ...

随机推荐

  1. [07-01]http网页提示含义

    出现较多的一些网页代码提示的意思: 100 - 继续. 101 - 切换协议. 110 重新启动标记答复. 120 服务已就绪,在 nnn 分钟后开始. 125 数据连接已打开,正在开始传输. 150 ...

  2. Spark application注册master机制

    直接上Master类的代码: case RegisterApplication(description) => { if (state == RecoveryState.STANDBY) { / ...

  3. bootstrap 中关于 HTML5 aria-* and role的用法

    HTML5 aria-* and role 在bootstrap中看到role和aria-*,不知道干嘛的.google一下,发现aria的意思是Accessible Rich Internet Ap ...

  4. SPSS提示“列表中不允许存在字符串变量”的解决方法

    点击 查看 菜单->变量->将需要修改为数字类型的列属性改为数字,还可以更改小数位数

  5. 对Java代码加密的两种方式,防止反编译

    使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...

  6. 使用COE脚本绑定SQL Profile

    日常运维中,经常会遇到需要绑定好的执行计划的场景. 简单来说,就是将一个sql_id绑定好的plan_hash_value.如果没有使用到绑定变量,还需要把force_match设置为true. 用到 ...

  7. eclipse启动时自动多一个javaw.exe的进程解决办法

    问题描述:(My)Eclipse软件打开时,通过任务管理器发现有一个javaw.exe的进程自动启动. 并且关闭此进程时,(My)Eclipse会随之报错终止运行. 原因:启动(My)Eclipse的 ...

  8. 213. House Robber II(动态规划)

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  9. ECMAScript6 入门教程 初学记录let命令 块级作用域

    一.基本语法-let命令 (1)ES6新增了let命令,用来声明变量.所声明的变量,只在let命令所在的代码块内有效. 循环的计数器,就很合适使用let命令.计数器i只在for循环体内有效,在循环体外 ...

  10. Java IO--NIO(一)

    一.基本概念描述 1.1 I/O简介 I/O即输入输出,是计算机与外界世界的一个接口.IO操作的实际主题是操作系统.在java编程中,一般使用流的方式来处理IO,所有的IO都被视作是单个字节的移动,通 ...