在开发程序的时候,为了提高用户的使用体验,或满足相关用户的功能,总是离不开拖放功能。而本文是总结winform下的常用拖放操作。主要有

1.textbox接受拖放的文件
2.listbox允许用户自定义排序
3.listbox之间的拖放
4.控件的拖放
5.console的拖放问题

用户在进行拖放操作时,经过的步骤大体如下:
例如将A中的数据拖放的B中
鼠标点击A中的数据(MouseDown)->鼠标移动(MouseMove)->出源数据边界,即出A(DragLeave)->进入目标边界,进入B(DragEnter)->在B中移动,选择放数据的位置,即拖动效果(DragOver)->抬起鼠标(MouseDown)->将A数据放到B中,拖放结束。(DragDrop,所有的拖放都涉及DragDrop事件)。

下面的所有例子,都会使用到上面所列举的几个事件。

一、textbox接受拖放的文件。为了方便用户的使用,这个应该是最常用到的操作。加入这个功能,可以使用户省去“打开文件对话框,然后选择文件”的操作。在这个例子中,我们不需要知道用户的点击,即选择了什么文件。只需要了解用户拖动文件进入Textbox(DragEnter),并松开鼠标,完成拖放(DragDrop)。主要涉及到两个事件。

DragEnter:在将对象拖入控件的边界时发生。判断是否是文件拖放

DragDrop:在完成拖放操作时发生。判断文件类型,只添加txt文件

首先添加一个textBox控件,将控件的属性设置为AllowDrop=True,Multiline=True
代码如下:

private void textBox1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
} private void textBox1_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
if(Path.GetExtension(file)==".txt") //判断文件类型,只接受txt文件
{
textBox1.Text += file + "\r\n";
}
} }

二、listbox允许用户自定义排序。在一个listbox中的拖放操作,我们要知道用户选择了什么数据(MouseDown),要把数据放到哪里,即坐标(DragOver),完成拖放(DragDrop)。主要涉及的事件有3个
MouseDown:选择Listbox中的item
DragOver: 鼠标的移动
DragDrop: 拖放完成。在鼠标当前位置插入数据

首先在窗体上加入Listbox控件,将AllowDrop属性设置为True
代码如下:

private void FrmListboxDragTest_Load(object sender, EventArgs e)
{
for (int i = ; i <= ; i++)
{
this.listBox1.Items.Add(string.Format("事件{0}",i));
}
} private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
if (this.listBox1.SelectedItem == null)
{
return;
}
//开始拖放操作,DragDropEffects为枚举类型。
//DragDropEffects.Move 为将源数据移动到目标数据
this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move);
} private void listBox1_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
} private void listBox1_DragDrop(object sender, DragEventArgs e)
{
Point point = listBox1.PointToClient(new Point(e.X, e.Y));
int index = this.listBox1.IndexFromPoint(point);
if (index < )
{
index = this.listBox1.Items.Count - ;
}
//获取拖放的数据内容
object data = e.Data.GetData(typeof(string));
//删除元数据
this.listBox1.Items.Remove(data);
//插入目标数据
this.listBox1.Items.Insert(index, data);
}

三.listbox之间的拖放。因为是在Listbox之间拖放数据,所以涉及到两个控件。假如本例是将Listbox1中的数据拖放到Listbox2中。那涉及的事件有4个
Listbox1 中的MouseDown:选取Listbox1中的数据
Listbox2 中的DragEnter:拖放操作进入Listbox2
Listbox2 中的DragOver: 在Listbox2上移动
Listbox2 中的DragDrop: 拖放完毕,在Listbox2中显示数据

代码如下:

private void FrmTwoListboxDragTest_Load(object sender, EventArgs e)
{
for (int i = ; i <= ; i++)
{
this.listBox1.Items.Add(string.Format("listbox1中的数据{0}", i));
this.listBox2.Items.Add(string.Format("listbox2中的数据{0}", i));
}
} private void listBox1_MouseDown(object sender, MouseEventArgs e)
{
if (listBox1.Items.Count == )
return; int index = listBox1.IndexFromPoint(e.X, e.Y);
string s = listBox1.Items[index].ToString();
listBox1.DoDragDrop(s, DragDropEffects.Copy);
} private void listBox2_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.StringFormat))
e.Effect = DragDropEffects.Copy;
} private void listBox2_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
} private void listBox2_DragDrop(object sender, DragEventArgs e)
{
Point point = listBox2.PointToClient(new Point(e.X, e.Y));
int index = this.listBox1.IndexFromPoint(point);
if (index < )
{
index = this.listBox1.Items.Count - ;
}
object data = e.Data.GetData(typeof(string));
this.listBox1.Items.Remove(data);
this.listBox2.Items.Insert(index, data);
}

4.控件的拖放。以pictureBox为例。涉及的事件有
MouseDown 选取pictureBox,可以判断鼠标按键(左键还是右键等)
MouseMove 移动鼠标到指定位置
MouseUp 释放鼠标按键,放下pictureBox

在进行控件移动的时候,需要明白pictureBox的坐标并不是鼠标的坐标,MouseDown只是在鼠标按下后执行一次,而MouseMove随着pictureBox的移动而不停的触发。

代码如下:

private bool _clicked = false;
private int _clickx;
private int _clicky;
private int _mouseDownCount = ;
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (_clicked)
{
Point p = new Point();
p.X = e.X + pictureBox1.Left;
p.Y = e.Y + pictureBox1.Top;
pictureBox1.Left = p.X - _clickx;
pictureBox1.Top = p.Y - _clicky;
lblMouseMove.Text = string.Format("{0}:{1}", pictureBox1.Left, pictureBox1.Top);
}
} private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
_clicked = false;
lblMouseUp.Text = string.Format("{0}:{1}", e.X,e.Y);
} private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
pictureBox1.Left = e.X;
pictureBox1.Top = e.Y;
_clickx = e.X;
_clicky = e.Y;
lblMouseDown.Text = string.Format("{0}:{1}:{2}", e.X, e.Y,_mouseDownCount);
_clicked = true;
_mouseDownCount += ;
}

五、console的拖放问题
console 的拖放时最简单的一种操作,因为console本身就支持拖放(如同cmd)。而我们所要做的只是添加一行代码,然后等待用户按下回车。例如:

string content=Console.ReadLine();
Console.WriteLine(content);
Console.ReadLine();

C# Winform 涉及的拖放操作总结的更多相关文章

  1. C# Winform 拖放操作

    http://www.cnblogs.com/imlions/p/3189773.html 在开发程序的时候,为了提高用户的使用体验,或满足相关用户的功能,总是离不开拖放功能.而本文是总结winfor ...

  2. [WinForm]WinForm跨线程UI操作常用控件类大全

    前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...

  3. nw.js如何处理拖放操作

    nw.js如何处理拖放操作 其实拖放(drag-drop)操作是Html5的功能,不是nw.js的内置API,那么我们采用Html5应用一般的处理方法就可以了. 首先我们看一下一个正常的页面,直接拖放 ...

  4. Windows的拖放操作使用方法

    Windows的拖放操作使用方法

  5. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  6. FileZilla无法确定拖放操作的目标,由于shell未正确安装

    天有不测风云,突然间,用filezilla下载ftp上的文件到桌面的时候,提示"无法确定拖放操作目标.由于shell未正确安装" 解决办法很简单,执行如下几步就OK了 1.在CMD ...

  7. 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作

    [源码下载] 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作 作者:webabcd 介绍背水一战 ...

  8. [小技巧]Filezilla无法确定拖放操作目标,由于shell未正确安装__解决办法

    重装系统及相关软件之后,用filezilla拖拽ftp上的文件到桌面的时候,提示"无法确定拖放操作目标......" 解决办法很简单,执行如下几步就OK了 ①在CMD中,进入Fil ...

  9. 第90天:HTML5中文件API和拖放操作

    一.文件API File API:提供客户端本地操作文件的可能 multiple是让文件域可以多选 <!DOCTYPE html> <html lang="en" ...

随机推荐

  1. Servlet & JSP - 中文字符问题

    Servlet 中的中文字符 来自 URL 参数部分的中文字符 Tomcat 默认接收数据的编码是 ISO-8859-1.所以当请求 URL 的参数部分含有中文字符,需要转换字符的编码. Enumer ...

  2. Nginx - Additional Modules, About Your Visitors

    The following set of modules provides extra functionality that will help you find out more informati ...

  3. ScrollView 与ListView 滑动冲突完美解决

    一.介绍ListView高度的设置方法 二.根据实际需求解决冲突问题 一.介绍ListView高度的设置方法 在ScrollView中使用ListView,ListView的高度会不正常. 方式一:在 ...

  4. Contoso 大学 - 10 - 高级 EF 应用场景

    原文 Contoso 大学 - 10 - 高级 EF 应用场景 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Micros ...

  5. 免费的HTML5连载来了《HTML5网页开发实例详解》连载(五)图解通过Fiddler加速开发

    Fiddler是Windows底下最强大的请求代理调试工具,监控任何浏览器的HTTP/HTTPS流量,窜改客户端请求和服务器响应,解密HTTPS Web会话,图4.44为Fiddler原理示意图. 图 ...

  6. header函数

    header函数 主要用于对http协议头设置相关信息 设置浏览器显示编码(解决乱码) header("Content-type:text/html;charset=utf-8") ...

  7. vm安装mac系统

    零:起因想学习IOS开发,但是mac pro和mac mini都舍不得买,去apple店体验了几次mac不怎么喜欢,so… 一:原料VMware-workstation-full-12.0.0-298 ...

  8. LXC-Linux Containers介绍

    Linux Containers,Linux的容器,容器嘛,可以想象成一个大的装东西的罐子,罐子口很大,里面可以装很多同样形状,只不过大小不同的小罐子.专业的话,叫做基于容器的操作系统层面的虚拟化技术 ...

  9. 如何在Android SDK 下查看应用程序输出日志的方法

          该文章源于安卓教程网(http://android.662p.com),转载时要注明文章的来自和地址,感谢你的支持. 在Android程序中可以使用 android.util.Log 类来 ...

  10. JAVA_SE复习(OOP1)

    面向对象编程(一) 一.继承 1. 在类图表示中,使用一个分为三块的矩形表示一个类.矩形的第一块表示类名,第二块描述这个类的属性及属性的数据类型,第三块描述这个类的操作,也就是方法以及返回类型.    ...