C# Winform 涉及的拖放操作总结

摘要:
而本文是总结winform下的常用拖放操作。主要涉及到两个事件。主要涉及的事件有3个MouseDown:选择Listbox中的itemDragOver:鼠标的移动DragDrop:拖放完成。在鼠标当前位置插入数据首先在窗体上加入Listbox控件,将AllowDrop属性设置为True代码如下:privatevoidFrmListboxDragTest_Load{for{this.listBox1.Items.Add;}}privatevoidlistBox1_MouseDown{if{return;}//开始拖放操作,DragDropEffects为枚举类型。//DragDropEffects.Move为将源数据移动到目标数据this.listBox1.DoDragDrop;}privatevoidlistBox1_DragOver{e.Effect=DragDropEffects.Move;}privatevoidlistBox1_DragDrop{Pointpoint=listBox1.PointToClient;intindex=this.listBox1.IndexFromPoint;if{index=this.listBox1.Items.Count-1;}//获取拖放的数据内容objectdata=e.Data.GetData;//删除元数据this.listBox1.Items.Remove;//插入目标数据this.listBox1.Items.Insert;}三.listbox之间的拖放。假如本例是将Listbox1中的数据拖放到Listbox2中。

在开发程序的时候,为了提高用户的使用体验,或满足相关用户的功能,总是离不开拖放功能。而本文是总结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(objectsender, DragEventArgs e)
{
    if(e.Data.GetDataPresent(DataFormats.FileDrop))
    {
        e.Effect =DragDropEffects.Copy;
    }
}

private void textBox1_DragDrop(objectsender, DragEventArgs e)
{
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
    foreach (string file infiles)
    {
        if(Path.GetExtension(file)==".txt")  //判断文件类型,只接受txt文件
{
            textBox1.Text += file + "
";
        }
    }
                
}

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

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

private void FrmListboxDragTest_Load(objectsender, EventArgs e)
{
    for (int i = 0; i <= 20; i++)
    {
        this.listBox1.Items.Add(string.Format("事件{0}",i));
    }
}

private void listBox1_MouseDown(objectsender, MouseEventArgs e)
{
    if (this.listBox1.SelectedItem == null)
    {
        return;
    }
    //开始拖放操作,DragDropEffects为枚举类型。
    //DragDropEffects.Move 为将源数据移动到目标数据
    this.listBox1.DoDragDrop(this.listBox1.SelectedItem, DragDropEffects.Move);  
}

private void listBox1_DragOver(objectsender, DragEventArgs e)
{
    e.Effect =DragDropEffects.Move;
}

private void listBox1_DragDrop(objectsender, DragEventArgs e)
{
    Point point = listBox1.PointToClient(newPoint(e.X, e.Y));
    int index = this.listBox1.IndexFromPoint(point);
    if (index < 0)
    {
        index = this.listBox1.Items.Count - 1;
    }
    //获取拖放的数据内容
    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(objectsender, EventArgs e)
{
    for (int i = 0; i <= 20; i++)
    {
        this.listBox1.Items.Add(string.Format("listbox1中的数据{0}", i));
        this.listBox2.Items.Add(string.Format("listbox2中的数据{0}", i));
    }
}

private void listBox1_MouseDown(objectsender, MouseEventArgs e)
{
    if (listBox1.Items.Count == 0)
        return;

    int index =listBox1.IndexFromPoint(e.X, e.Y);
    string s =listBox1.Items[index].ToString();
    listBox1.DoDragDrop(s, DragDropEffects.Copy);
}

private void listBox2_DragEnter(objectsender, DragEventArgs e)
{
    if(e.Data.GetDataPresent(DataFormats.StringFormat))
        e.Effect =DragDropEffects.Copy;
}

private void listBox2_DragOver(objectsender, DragEventArgs e)
{
    e.Effect =DragDropEffects.All;
}

private void listBox2_DragDrop(objectsender, DragEventArgs e)
{
    Point point = listBox2.PointToClient(newPoint(e.X, e.Y));
    int index = this.listBox1.IndexFromPoint(point);
    if (index < 0)
    {
        index = this.listBox1.Items.Count - 1;
    }
    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 = 1;
private void pictureBox1_MouseMove(objectsender, MouseEventArgs e)
{
    if(_clicked)
    {
        Point p = newPoint();
        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(objectsender, MouseEventArgs e)
{
    _clicked = false;
    lblMouseUp.Text = string.Format("{0}:{1}", e.X,e.Y);
}

private void pictureBox1_MouseDown(objectsender, 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 += 1;
}

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

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

免责声明:文章转载自《C# Winform 涉及的拖放操作总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇spring security session管理Ubuntu 下ftp服务器的安装配置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java 接收 char字符型

import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner;public class GetChar {public static void main(String[] args)throws Exception {//通过扫描类输入Scan...

Go语言读取网上Json格式的天气预报数据例子

天气预报接口使用的是:http://www.weather.com.cn/data/sk/101010100.html 这里的Json数据如下:   {        "weatherinfo": {               "city": "北京",               "cityid": "101010100",             ...

ClassLoader读取classpath目录下的文件

项目中的需求是根据配置文件创建一个页面,配置文件中配置一些图例或者搜索框。读取classpath目录下文件的方式有很多,且记录自己在项目中用到的一种方式。 ClassLoader主要是对类的请求提供服务,当jvm需要某个类时,它根据名称向ClassLoader请求获得这个类,然后ClassLoader返回给jvm这个类的class对象。ClassLoad...

SpringBoot集成redisson分布式锁

原文链接:https://blog.csdn.net/sinat_25295611/article/details/80420086 https://www.cnblogs.com/yangzhilong/p/7605807.html 业务场景:在电商项目中,往往会有这样的一个功能设计,当用户下单后一段时间没有付款,系统就会在超时后关闭该订单。 通常我们会...

Flink--将表转换为DataStream或DataSet

A Table可以转换成a DataStream或DataSet。通过这种方式,可以在Table API或SQL查询的结果上运行自定义的DataStream或DataSet程序 将表转换为DataStream 有两种模式可以将 Table转换为DataStream: 1:Append Mode 将一个表附加到流上 2:Retract Mode 将表转换为流...

delphi idhttp 实战用法(TIdhttpEx)

以delphi XE8 自带indy(10.5.8.0)组件为例,分享实战中遇到的问题及解决方法。 TIdHttpEx 用法实例01[多线程获取网页](包含完整源码) 实例02(如何Post参数,如何保存与提取Cookie)待写 TIdHttpEx 已实现了对GZIP的解压,对UTF-8编码解码等 本文包含以下几个单元 uIdhttp.pas (TIdHt...