C#拖拽操作
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#拖拽操作的更多相关文章
- WPF 的拖拽操作(DragDrop)
在WPF中似乎没有对拖拽操作进行改变,和以前的方式一样.如果曾近在 Windows 窗体应用程序中使用过鼠标拖放,就会发现在 WPF 中的编程接口实际上没有发生变化.重要的区别是用于拖放操作的方法和事 ...
- 微信小程序~触摸相关事件(拖拽操作、手势识别、多点触控)
touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 touchend 手指触摸动作结束 ...
- H5 拖拽操作
H5 拖拽操作 前言 在原生H5中,可以通过提供的api实现在网页内元素的拖拽操作.相对于传统的写法更加的简单. 而想要实现拖拽,主要需要进行两个方面的工作,第一是给元素设置draggable='tr ...
- selenium中各个模块操作:下拉框、鼠标悬浮连贯、拼图拖拽操作、以及其他拖拽操作、连线操作
1.下拉框的修改操作 方法一:定位到元素后,通过select选择对应的值 方法二:通过两次点击的方法:没有select的value属性时,采用click两次的方法去选择: click第一次后,出现下拉 ...
- 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作
回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...
- MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】
根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle ...
- MVC+ZTree实现对树的CURD及拖拽操作
上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除节点,编辑 ...
- 【PUPPETEER】初探之拖拽操作(五)
一.知识点 page.mouse elementHandle.boundingBox() ignoreDefaultArgs:['--enable-automation'] waitUntil 二 ...
- javascript拖拽操作
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- Druid.io启用SQL支持
Druid.io的SQL功能虽然在试验阶段,但是也支持了大部分的功能,而且还可以通过 Avatica JDBC查看请求的json,有助于我们理解Druid.io的语法.Druid.io有个比较坑的是, ...
- 【译】第十五篇 Integration Services:SSIS参数
本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...
- 一个罕见的MSSQL注入漏洞案例
一个罕见的MSSQL注入漏洞案例 这里作者准备分享一个在去年Google赏金计划中发现的相当罕见漏洞,也是作者在整个渗透测试生涯中唯一一次遇到的. 目标网站使用了微软 SQL Server 数据库并且 ...
- 2016.5.18——leetcode:Majority Element
Majority Element 本题收获: 1.初步了解hash,nth_element的用法 2.题目的常规思路 题目: Given an array of size n, find the ma ...
- j-linkV8固件更新(任意版本)
在使用j-link v8调试程序时,容易出现固件丢失或出错的情况,导致电脑不能识别,j-link上面的灯不亮.我今天刚刚遇到了这个情况,于是就拆开外壳,在网上搜索资料,发现刷固件相关的还真多,但是有一 ...
- HTML5 之图片上传预处理
在开发 H5 应用的时候碰到一个问题,应用只需要一张小的缩略图,而用户用手机上传的确是一张大图,手机摄像机拍的图片好几 M,这可要浪费很多流量. 像我这么为用户着想的程序员,绝对不会让这种事情发生的, ...
- Linux 网络编程实例
/*socket->bind->listen->accept->recv/recvfrom->send/sendto->close 客户端:socket->c ...
- nvm npm node.js的关系
nvm npm node.js都是用来构建reactNativ的项目 nvm管理node.j和npm版本的 node.js管理reactNative开发中所需要的代码库的 npm管理对应node ...
- file.getPath() getAbsolutePath() getCanonicalPath()区别
package file; import java.io.File; import java.io.IOException; public class getFilePath { public sta ...
- luoguP2735 电网 Electric Fences
一道校内模拟赛遇见的题 ** 不会正解就真的很麻烦的 数学题 ** 有一种东西叫 皮克定理 发现的千古神犇: 姓名:George Alexander Pick(所以叫皮克定理呀 国籍:奥地利(蛤!竟然 ...