Windows窗体控件实现内容拖放(DragDrop)功能
一、将控件内容拖到其他控件
在开发过程中,经常会有这样的要求,拖动一个控件的数据到另外一个控件中。例如将其中一个ListBox中的数据拖到另一个ListBox中。或者将DataGridView中的数据拖动到TreeView的某个节点。
在应用程序中,是通过处理一系列事件,如DragEnter,DragLeave和DragDrop事件来实现在Windows应用程序中的拖放操作的。通过使用这些事件参数中的可用信息,可以轻松实现拖放操作。
拖放操作在代码中是通过三步实现的,首先是启动拖放操作,在需要拖动数据的控件上实现MouseDown事件响应代码,并调用DoDragDrop()方法;其次是实现拖放效果,在目标控件上添加DragEnter事件响应代码,使用DragDropEffects枚举类型实现移动或复制等拖动效果;最后是放置数据操作,在目标控件上添加DragDrop响应代码,把数据添加到目标控件中。
private void Form1_Load(object sender, System.EventArgs e)
{
this.listBox1.AllowDrop = true;
this.listBox2.AllowDrop = true;
this.listBox1.Items.Add("a");
this.listBox1.Items.Add("b");
this.listBox1.Items.Add("c");
} private void listBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.listBox1.DoDragDrop(this.listBox1.Items[this.listBox1.SelectedIndex], DragDropEffects.Move);
} private void listBox2_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.Text))
{
e.Effect = DragDropEffects.Move;
}
} private void listBox2_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
this.listBox2.Items.Add(e.Data.GetData(DataFormats.Text));
this.listBox1.Items.Remove(e.Data.GetData(DataFormats.Text));
}
二、将文件拖到控件中获得文件路径
把文件或者目录直接拖放到你的程序上,这种效果用户体验不错。
得到拖过来的路径的代码:(System.Array)e.Data.GetData(DataFormats.FileDrop)。
然后你可以根据这些路径复制粘贴了。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
SetCtrlDrag.SetCtrlDragEvent(this.textBox1);
}
} public class SetCtrlDrag
{
public static void SetCtrlDragEvent(Control ctrl)
{
if (ctrl is TextBox)
{
TextBox tb = ctrl as TextBox;
tb.AllowDrop = true;
tb.DragEnter += (sender, e) =>
{
e.Effect = DragDropEffects.Link;//拖动时的图标
};
tb.DragDrop += (sender, e) =>
{
((TextBox)sender).Text = ((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
};
}
}
}
界面效果

三、相关说明
msdn:http://msdn.microsoft.com/zh-cn/library/system.windows.forms.dragdropeffects.aspx
1.方法
实现拖放效果时,C#中提供了一个系统方法DoDragDrop方法,用于实现开始拖放操作,该方法由Control类所定义,由于控件均直接或是间接派生于Control类,因此开发人员可以在任何可视化组件中调用DoDragDrop方法。DoDragDrop方法使用语法如下:
public DragDropEffects DoDragDrop ( Object data,DragDropEffects allowedEffects)
data:用户所要拖动的数据内容。必须将所要拖动的内容传入到这个方法的第一个参数位置。
allowedEffects:DragDropEffects枚举值之一,此类型包含了拖动操作的效果。DragDropEffects枚举值如表32.8所示。
DragDropEffects枚举值:
- All: 从拖动源复制、移除数据,并将其滚动到放置目标中
- Copy: 将数据复制到放置目标
- Link: 将拖动源中的数据链接到放置目标
- Move: 将拖动源的数据移动到放置目标
- None: 放置目标不接受该数据
- Scroll :即将在放置目标中开始滚动,或当前正在滚动
开发人员在使用DoDragDrop方法时,必须指定参数allowedEffects为表中的任何一个成员,另外,还可以使用位运算符,把其中的任何一个成员作为一个完整参数传入,以得到所需的拖动效果,实现关键代码如下:
DragDropEffects.Copy| DragDropEffects.None
2.事件
C#中提供了一个系统拖放事件,与拖放方法一起使用来达到更好的效果。常用的拖放事件如表所示。
目标上的事件:
- DragEnter: 当用户在拖放操作过程中首次将鼠标光标拖到控件上时,会引发该事件
- DragOver: 如果鼠标移动但停留在同一个控件中,则引发DragOver事件
- DragDrop: 在完成拖放操作时发生
- DragLeave: 如果用户移出一个窗口,则引发DragLeave事件
源上的事件:
- GiveFeedback: 在执行拖动操作期间发生
- QueryContinueDrag: 在拖放操作过程中,当键盘或鼠标按钮状态发生变化时,会引发QueryContinueDrag 事件。QueryContinueDrag事件允许拖动源确定是否应取消拖放操作
Windows窗体控件实现内容拖放(DragDrop)功能的更多相关文章
- 用于列出选项的Windows窗体控件
可以提供选项列表的控件有ListBox.ComboBox.CheckedListBox,如何正确的使用和选择这些控件,下面对此进行讨论.首先对这三种控件的功能分别进行说明: ListBox ListB ...
- 如何:对 Windows 窗体控件进行线程安全调用
http://msdn.microsoft.com/zh-cn/library/ms171728(VS.90).aspx http://msdn.microsoft.com/zh-cn/library ...
- c#中跨线程调用windows窗体控件
c#中跨线程调用windows窗体控件解决. 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来 ...
- c#中如何跨线程调用windows窗体控件
c#中如何跨线程调用windows窗体控件? 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首 ...
- 如何跨线程调用Windows窗体控件
通过一个子线程来操作主线程中的控件,但是,这样作会出现一个问题(如图1所示),就是TextBox控件是在主线程中创建的,在子线程中并没有对其进行创建,也就是从不是创建控件的线程访问它.那么,如何解决跨 ...
- c#中如何跨线程调用windows窗体控件?
我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍.首先来看传统方法: public partial c ...
- vs2017 C# ActiveX浏览器插件 创建 发布 C# windows窗体控件库(.NET Framework)注意事项
vs2017需要安装插 插件下载地址:https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.Micro ...
- 如何 对 Windows 窗体控件进行线程安全调用
//主线程 public delegate void UpdateMessage(string mes); public void UpdatePortMessage(string mes) { th ...
- KRBTabControl(中文)Windows选项卡控件
本文阐述了如何在C#使自定义Windows选项卡控件. Download demo project - 82.4 KB Download source - 252 KB 介绍 本文讨论如何使用.NET ...
随机推荐
- 逸鹏说道公众号福利:逆天常用的一些谷歌浏览器插件V1.3
插件导出:http://www.cnblogs.com/dunitian/p/5426552.html 插件导入:https://www.cnblogs.com/dotnetcrazy/p/97537 ...
- Appcrawler 参数实战经验
https://testerhome.com/topics/10574 https://yq.aliyun.com/articles/277985 https://github.com/sevenir ...
- SpringMVC的拦截器讲解
Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理. 用户可以自己定义一些拦截器来实现特定的功能. 谈到拦截器,还要向大家提一个词 ...
- 查看端口被哪个程序占用的DOS命令
netstat -aon | findstr 80Proto Local Address Foreign Address State PID==== ============ ============ ...
- RDP Error: The Identity Of The Remote Computer Cannot Be Verified
As i always need to remote to 20 servers at the same time, so i use a tool called Remote Desktop Con ...
- es6新特性-解构表达式、Lambda表达式、局部变量及map/reduce方法
循环内的变量在循环外可见,不合理: let定义的变量是局部变量: const修饰的是常量,不允许再次修改,类似于java中的static: 解构表达式:
- (转)Nginx+rtmp+ffmpeg搭建流媒体服务器
(1)下载第三方扩展模块nginx-rtmp-module # mkdir module && cd module //创建一个存放模块的目录 # wget https://githu ...
- Disruptor底层源码解析(九)
架构图: 性能为什么这么牛逼: public void sendData(ByteBuffer data) { //1 在生产者发送消息的时候, 首先 需要从我们的ringBuffer里面 获取一个可 ...
- 转 让NET C# 程序独立运行(脱离 .NET Framework运行,绿色运行) 未验证
但是.net版本众多.而且.NET Framework框架很大.拖着一个大大的.net Framework总是让人很郁闷. 在网上找呀找呀.找到另一个.NET Framework 替代方案.Mono. ...
- Java调用WebService方法总结(4)--Axis调用WebService
Axis是比较常用的WebService框架,该项目在2006实现了最终版,后面就没有更新了.文中demo所使用到的软件版本:Java 1.8.0_191.Axis 1.4. 1.准备 参考Java调 ...