C# Winform 涉及的拖放操作总结
在开发程序的时候,为了提高用户的使用体验,或满足相关用户的功能,总是离不开拖放功能。而本文是总结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 涉及的拖放操作总结的更多相关文章
- C# Winform 拖放操作
http://www.cnblogs.com/imlions/p/3189773.html 在开发程序的时候,为了提高用户的使用体验,或满足相关用户的功能,总是离不开拖放功能.而本文是总结winfor ...
- [WinForm]WinForm跨线程UI操作常用控件类大全
前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...
- nw.js如何处理拖放操作
nw.js如何处理拖放操作 其实拖放(drag-drop)操作是Html5的功能,不是nw.js的内置API,那么我们采用Html5应用一般的处理方法就可以了. 首先我们看一下一个正常的页面,直接拖放 ...
- Windows的拖放操作使用方法
Windows的拖放操作使用方法
- C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...
- FileZilla无法确定拖放操作的目标,由于shell未正确安装
天有不测风云,突然间,用filezilla下载ftp上的文件到桌面的时候,提示"无法确定拖放操作目标.由于shell未正确安装" 解决办法很简单,执行如下几步就OK了 1.在CMD ...
- 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作
[源码下载] 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作 作者:webabcd 介绍背水一战 ...
- [小技巧]Filezilla无法确定拖放操作目标,由于shell未正确安装__解决办法
重装系统及相关软件之后,用filezilla拖拽ftp上的文件到桌面的时候,提示"无法确定拖放操作目标......" 解决办法很简单,执行如下几步就OK了 ①在CMD中,进入Fil ...
- 第90天:HTML5中文件API和拖放操作
一.文件API File API:提供客户端本地操作文件的可能 multiple是让文件域可以多选 <!DOCTYPE html> <html lang="en" ...
随机推荐
- TCP基础知识
TCP/IP网络协议栈分为应用层(Application).传输层(Transport).网络层(Network)和链路层(Link)四层.如下图所示 两台计算机通过TCP/IP协议通讯的过程如下所示 ...
- Jquery 全选、反选问题解析
最近工作中,需要使用Jquery实现复选框的全选和反选,本人虽然不是专职撸前端的,但这个小问题感觉也没什么难度,下面直接上代码: <div id="list"> < ...
- asp.net上传文件时出现 404 - 找不到文件或目录。
昨天客户网站反应上传较大文件时出现404-找不到文件或目录的错误.如图: 网站上给出的提示是上传文件不能超过50M,但是在38M和40M这样的文件都不能上传了,显然不对. 在网上查了很久,第一个是检查 ...
- eclipse插件hibernate tools安装 爱好者
eclipse helios(3.6)版 1.启动eclipse 2.选择Help > Install New Software...> 3.添加如下地址:http://download. ...
- 关于iOS9中配置App Transport Security(应用程序传输安全协议)
在 在info.plist中,进行上面的配置就行了,注意的是,那个网址,你需要访问什么网址,就填写什么网址就行了. NSTemporaryExceptionAllowsInsecureHTTPLoad ...
- Remote Desktop Organizer远程桌面管理软件的基本使用和介绍
<Remote Desktop Organizer>是一款用于远程桌面管理的软件.软件支持windows平台运行. Remote Desktop Organizer 是一款 Windows ...
- Excel常用函数
1.基本的算数函数 sum() average() 2.三角函数 sin() cos() 3.
- DEDECMS中,arclist标签
文档列表 dede:arclist 标签: {dede:arclist flag='h' typeid='' row='' col='' titlelen='' infolen='' imgwidt ...
- PHP 魔术方法 __construct __destruct (一)
慢慢长寻夜,明月高空挂 __construct() - 在每次创建新对象时先调用此方法 __destruct() - 对象的所有引用都被删除或者当对象被显式销毁时执行 <?php /** * ...
- link方式安装Eclispe插件:greenUML
用Link方式安装Eclipse插件有几点好处: (1)把自己的插件和Eclipse自带的插件分离 (2)可以通过修改link文件来决定是否加载该插件 (3)重新安装Eclipse的时候,直接拷贝自己 ...