C#的拖拽

本文将以Winform为例

有两个主要的事件:

DragEnter 拖拽到区域中触发的事件

DragDrop 当拖拽落下的时候出发此事件

饮水思源

参考博客: http://www.cnblogs.com/gossip/archive/2010/02/22/1671126.html

Demo 模拟拖拽上传

我们在开发中有时候回用到拖拽上传的功能,例如QQ邮箱上传附件的时候,博客园Mark Down编辑器上传图片的时候。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace StudyDrag
{
public partial class frmDragUpload : Form
{
public frmDragUpload()
{
InitializeComponent();
} /// <summary>
/// 初始化属性
/// </summary>
void Init()
{
//设置为允许拖拽
this.AllowDrop = true;
} /// <summary>
/// 注册事件
/// </summary>
void RegisteEvent()
{
this.DragEnter += FrmDragUpload_DragEnter;
this.DragDrop += FrmDragUpload_DragDrop;
} /// <summary>
/// 当在此区域拖动落下的时候出发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmDragUpload_DragDrop(object sender, DragEventArgs e)
{
//获取拖动的数据
IDataObject ido = e.Data;
//如果拖动的数据是文件类型
if (ido.GetDataPresent(DataFormats.FileDrop))
{
//获取文件的路径
string[] paths = (string[])ido.GetData(DataFormats.FileDrop); //执行我们想要执行的业务逻辑,读取上传到服务器等等。
foreach (var item in paths)
{
Console.WriteLine(item);
}
MessageBox.Show("上传成功!");
}
else
{
MessageBox.Show("上传类型错误!");
}
} /// <summary>
/// 当拖动到此区域的时候触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmDragUpload_DragEnter(object sender, DragEventArgs e)
{
//设置拖动的影响为:从拖动源复制到拖动的目标
e.Effect = DragDropEffects.Copy;
} /// <summary>
/// 窗体初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmDragUpload_Load(object sender, EventArgs e)
{
this.Init();
this.RegisteEvent();
}
}
}

Demo 2 ListView拖拽到TreeView上

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace StudyDrag
{
public partial class frmDragListView : Form
{
public frmDragListView()
{
InitializeComponent();
} /// <summary>
/// 初始化属性
/// </summary>
void Init()
{
this.lbDep.AllowDrop = true;
this.tvDep.AllowDrop = true;
} /// <summary>
/// 加载一些数据
/// </summary>
void LoadData()
{
for (int i = 1; i <= 10; i++)
{
string itemValue = "有关部门" + i.ToString();
this.lbDep.Items.Add(itemValue);
}
} void RegisterEvent()
{
this.tvDep.DragDrop += TvDep_DragDrop;
this.tvDep.DragEnter += TvDep_DragEnter;
} /// <summary>
/// 当拖拽进入到该区域的时候出发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TvDep_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Copy;
} /// <summary>
/// 当完成退拽时触发的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TvDep_DragDrop(object sender, DragEventArgs e)
{
string item = (string)e.Data.GetData(DataFormats.Text);
this.tvDep.Nodes.Add(item);
} /// <summary>
/// 窗体初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmDragListView_Load(object sender, EventArgs e)
{
Init();
LoadData();
RegisterEvent();
} /// <summary>
/// 鼠标点击的的时候开始执行拖拽操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lbDep_MouseDown(object sender, MouseEventArgs e)
{
if (lbDep.SelectedItem == null)
{
return;
} lbDep.DoDragDrop(lbDep.SelectedItem, DragDropEffects.Copy);
}
}
}

源码下载

我的码云:https://git.oschina.net/ShareKnowledge/drag

C#拖拽操作的更多相关文章

  1. WPF 的拖拽操作(DragDrop)

    在WPF中似乎没有对拖拽操作进行改变,和以前的方式一样.如果曾近在 Windows 窗体应用程序中使用过鼠标拖放,就会发现在 WPF 中的编程接口实际上没有发生变化.重要的区别是用于拖放操作的方法和事 ...

  2. 微信小程序~触摸相关事件(拖拽操作、手势识别、多点触控)

    touchstart     手指触摸动作开始 touchmove    手指触摸后移动 touchcancel  手指触摸动作被打断,如来电提醒,弹窗 touchend      手指触摸动作结束 ...

  3. H5 拖拽操作

    H5 拖拽操作 前言 在原生H5中,可以通过提供的api实现在网页内元素的拖拽操作.相对于传统的写法更加的简单. 而想要实现拖拽,主要需要进行两个方面的工作,第一是给元素设置draggable='tr ...

  4. selenium中各个模块操作:下拉框、鼠标悬浮连贯、拼图拖拽操作、以及其他拖拽操作、连线操作

    1.下拉框的修改操作 方法一:定位到元素后,通过select选择对应的值 方法二:通过两次点击的方法:没有select的value属性时,采用click两次的方法去选择: click第一次后,出现下拉 ...

  5. 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作

    回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...

  6. MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】

    根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle ...

  7. MVC+ZTree实现对树的CURD及拖拽操作

    上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除节点,编辑 ...

  8. 【PUPPETEER】初探之拖拽操作(五)

    一.知识点 page.mouse elementHandle.boundingBox() ignoreDefaultArgs:['--enable-automation']   waitUntil 二 ...

  9. javascript拖拽操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. [大数据测试]ETL测试或数据仓库测试入门

    转载自: http://blog.csdn.net/zhusongziye/article/details/78633934 概述 在我们学习ETL测试之前,先了解下business intellig ...

  2. 【Foreign】Rectangle [KD-tree]

    Rectangle Time Limit: 50 Sec  Memory Limit: 512 MB Description Input Output Sample Input 0 4 2 0 2 1 ...

  3. C++传递二维数字给一个自定义函数

    如果参数是多维数组,那么参数必须指明第一维意外得所有未得长度:比如你的 void tt(char a[][20])或者 void tt(char (*a)[20]) 另外这样也是可以的char *a[ ...

  4. JavaScript的基本介绍

    JavaScript入门介绍 输出语句:document.write()   1.执行顺序:从上到下,每一天语句是要加分号的,如果不加的话,浏览器会默认帮你自动添加,分号.   2.注释:一行注释就是 ...

  5. 29、HashSet简介

    Set的特点 Set里面存储的元素不能重复,没有索引,存取顺序不一致. package com.monkey1024.set; import java.util.HashSet; /** * Set的 ...

  6. flask基础之请求处理核心机制(五)

    前言 总结一下flask框架的请求处理流程. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) flask基础之jijia2模板语言进阶(三) flask ...

  7. Word Ladder I & II

    Word Ladder I Given two words (start and end), and a dictionary, find the length of shortest transfo ...

  8. WPF中ListBox的绑定

    WPF中列表式控件派生自ItemsControl类,继承了ItemsSource属性.ItemsSource属性可以接收一个IEnumerable接口派生类的实例作为自己的值(所有可被迭代遍历的集合都 ...

  9. ASP.net-空白页的问题

    protected void Application_Error(object sender, EventArgs e)         {             ILog log = LogMan ...

  10. NuGet套件还原步骤(以vs2012为例)

    下载别人的范例,出现由于Nuget套件不存在而无法启动时: 效果如下图: 步骤如下: 1.点击 项目->启用NuGet程序包还原 2.点击下图中的是 3.点击下图中的确定 4.效果如图: . 5 ...