winform中的listbox实现拖拽功能

文章目录

  • 前言
  • 一、实现


前言

winform中的listBox实现拖拽!


一、实现

winform中的listbox实现拖拽只需要实现四个事件
1、准备两个listbox控件
在这里插入图片描述
其中listtarget,AllowDrop属性设置为True。
2、实现四个事件
2.1MouseDown

//在 MouseDown 事件期间,如果从鼠标位置起鼠标移动的距离大于 SystemInformation.DragSize,则启动拖动动作。
private void ListSource_MouseDown(object sender, MouseEventArgs e)
{//ListBox中Item项的索引indexOfItemUnderMouseToDrag = listSource.IndexFromPoint(e.X, e.Y);//鼠标悬停在列表框的​​有效项​​上(即 indexOfItemUnderMouseToDrag不是 -1)if (indexOfItemUnderMouseToDrag != ListBox.NoMatches){//记录鼠标按下位置,DragSize获取以鼠标按钮的按下点为中心的矩形的宽度和高度,在该矩形内不会开始拖动操作。Size dragSize =  SystemInformation.DragSize;//创建一个矩形区域(正方形)。以鼠标按下电为中心,以DragSize为高和宽的矩形。dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);}else{//如果鼠标没有选中ListBox项,则置矩形区域为空dragBoxFromMouseDown = Rectangle.Empty;}
}

2.2MouseMove

private void ListSource_MouseMove(object sender, MouseEventArgs e)
{/** 鼠标按钮状态是用​​位标志(bit flags)​​存储的:每个按钮对应一个二进制位可以同时检测多个按钮的状态&(按位与)操作可以提取特定按钮的状态* */if ((e.Button & MouseButtons.Left) == MouseButtons.Left){if (dragBoxFromMouseDown != Rectangle.Empty &&!dragBoxFromMouseDown.Contains(e.X,e.Y)){//传递ListBox选中项并触发DoDragDrop事件(这里可以是ListDragSoure触发,也可以是ListDragTarget)//DoDragDrop 方法确定当前光标位置下的控件。然后它将检查该控件是否是有效的放置目标。DragDropEffects dropEffect = listSource.DoDragDrop(listSource.Items[indexOfItemUnderMouseToDrag], DragDropEffects.All | DragDropEffects.Link);if(dropEffect != DragDropEffects.None){listSource.Items.RemoveAt(indexOfItemUnderMouseToDrag);if (indexOfItemUnderMouseToDrag > 0)listSource.SelectedIndex = indexOfItemUnderMouseToDrag - 1;else if (listSource.Items.Count > 0)listSource.SelectedIndex = 0;}}}
}

2.3DragDrop

private void Listtarget_DragDrop(object sender, DragEventArgs e)
{if (e.Data.GetDataPresent(typeof(String))){Object item = e.Data.GetData(typeof(String));if(e.Effect == DragDropEffects.Copy || e.Effect == DragDropEffects.Move){listtarget.Items.Add(item);}}
}

2.4DragEnter

/*
当用户拖动数据进入目标控件(例如一个ListBox或其他控件)时,此方法会被调用。
通过设置e.Effect = DragDropEffects.Move;,它告诉系统当前控件接受拖放操作,并且操作的类型是“移动”。
这个设置会改变鼠标光标的显示(通常会显示一个移动图标),给用户视觉反馈,表明松开鼠标后数据将被移动到这里。*/
private void Listtarget_DragEnter(object sender, DragEventArgs e)
{e.Effect = DragDropEffects.Move;
}

2.5绑定事件

private int indexOfItemUnderMouseToDrag;
private Rectangle dragBoxFromMouseDown;
public Form1()
{InitializeComponent();listSource.Items.AddRange(new string[] { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" });listSource.MouseDown += ListSource_MouseDown;listSource.MouseMove += ListSource_MouseMove;listtarget.DragDrop += Listtarget_DragDrop;listtarget.DragEnter += Listtarget_DragEnter;
}

效果图
在这里插入图片描述
注意:如果你的窗体内未使用Combox控件,则看这篇文章就行了。
如果使用到了Combox控件,建议看一下这篇文章“解决winform中的listbox实现拖拽时,遇到combox控件会闪烁的问题”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92659.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Docker 安装并启动 Redis:从入门到实战

用 Docker 安装并启动 Redis:从入门到实战Redis 作为一款高性能的键值对数据库,在缓存、会话存储、消息队列等场景中被广泛应用。本文将详细介绍如何使用 Docker 快速安装和启动 Redis,包括基础配置、数据持久化以及容器管理等核心操作&#…

ansible学习第一天

一:ansible基础知识1.1 ansible的定义与工作原理简述ansible是一个自动化运维工具,用于执行自动化任务,包括像配置管理,应用部署,任务执行等等,本质上来说也是基础设施及代码工具,通过可读性较强…

Vue原理与高级开发技巧详解

Vue 的底层原理、高级用法、性能优化和生态整合 文章目录Vue 的底层原理、高级用法、性能优化和生态整合一、Vue 双向绑定原理深度剖析1. Vue 2 实现原理(Object.defineProperty)2. Vue 3 实现原理(Proxy)3. v-model 高级用法二、…

axios的封装

axios的封装 在src目录下新建文件夹utils工具类,文件夹里面新建http.js文件,如果项目涉及到多个基地址可以新建http2.js文件。 import axios from axios;/*** 后端*/// 创建axios实例 const http axios.create({// 1.接口基地址baseURL: http://192.168…

MariaDB 数据库管理与web服务器

MariaDB 数据库管理与WEB 服务器 介绍 MariaDB 数据库介绍 **数据库,是一个存放计算机数据的仓库。**这个仓库是按照一定的数据结构来对数据进行组织和存储的,我们可以通过数据库提供的多种方法来管理其中的数据。 数据结构,是指数据的组织形…

分治-归并-912.排序数组-力扣(LeetCode)

一、题目解析1、将数组排升序2、在不使用任何内置函数的情况下解决问题二、算法原理分治-归并合并两个有序数组1、双指针遍历两个合并数组2、将比较后的较小值放到新开数组中3、防止有指针未遍历完&#xff0c;特殊处理4、将nums中的元素还原三、代码示例vector<int> tmp…

网络安全初学者学习心得

看到你对网络安全学习的兴趣&#xff0c;我感到非常振奋&#xff01;这个领域既充满挑战又回报丰厚&#xff0c;作为初学者&#xff0c;理清学习内容和方向确实至关重要。下面我将结合多年的行业观察和指导经验&#xff0c;为你详细拆解网络安全初学者的学习内容并分享一些核心…

防火墙笔记优化版

一、防火墙的核心定义防火墙是一种基于预设安全策略&#xff0c;用于隔离内网与外网、控制网络流量的安全系统&#xff08;可分为软件系统或硬件系统&#xff09;。其核心作用包括&#xff1a;流量隔离&#xff1a;物理或逻辑分隔内网、外网及 DMZ 区域&#xff08;DMZ 为内网与…

vue3前端项目cursor rule

cursor rule是什么&#xff0c;以及怎么定义&#xff0c;看这个文章&#xff1a; cursor中定义cursor rules_cursor rules如何编写-CSDN博客 针对现有一个vue3的前端项目&#xff0c;写了一份cursor rule&#xff0c;可以作为参考&#xff0c;内容如下&#xff08;仅作为参考&…

基于51单片机红外遥控定时开关智能家电插座设计

1. 功能介绍 本设计是一款基于 STC8C52 单片机 的智能家电插座系统&#xff0c;集 红外遥控控制、定时开关控制、自动与手动模式切换、掉电数据保存、液晶显示、蜂鸣器提示 于一体&#xff0c;能够方便用户对家用电器进行精准的定时控制与远程操作。系统广泛适用于家用电器、办…

下一代防火墙组网方案

知识回顾&#xff1a;1.传统防火墙包括包过滤防火墙、应用网关防火墙、状态检测防火墙。2.包过滤防火墙工作在3、4层。3.包过滤防火墙特点&#xff1a;4.应用网关防火墙主要作用&#xff1a;①截取用户初始化连接请求&#xff0c;对用户进行认证&#xff1b;②通过ALG能让多通道…

WEB开发-第二十七天(PHP篇)

DW PHPStorm PhpStudy Navicat Premium DW : HTML&JS&CSS开发 PHPStorm : 专业PHP开发IDE PhpStudy &#xff1a;Apache MYSQL环境 Navicat Premium: 全能数据库管理工 变量覆盖安全&#xff1a; $GLOBALS&#xff1a;这种全局变量用于在PHP脚本中的任意位置访…

Lwip深度阅读-网络架构

LWIP网络协议栈详细介绍 本文的内容基本基于野火的LWIP手册&#xff0c;和LWIP源码撰写。 网络协议栈概述 从图片可以看出&#xff0c;网络协议栈采用分层架构&#xff0c;每一层都有特定的功能和协议。 TCP/IP协议分层模型数据封装过程MAC数据包 我使用wireShark抓包的时候&am…

嵌入式系统学习Day16(C语言中的位运算)

位运算二进制位的运算嵌入式:通过位运算 控制 硬件运算: 运算规则 & 与 一假则假 | 或 一真则真 ~ 非 真假相对 ^ 异或 相同为假 不同为真 << 左移 表示二进制位的移动 >> 右移 eg:int a 0x55; int b 0x33;0101 0101 //0x55 &am…

Endnote下载,导入曼大 harvard_manchester格式

下载endnote 并激活中国农业科技文献与信息服务平台&#xff0c;点击下载 下载harvard_manchester 格式 Harvard Manchester - Referencing guide at the University of Manchester - Subject guides at University of Manchester 双击打开第二步下载的安装包&#xff08;使用…

【Docker进阶实战】从多容器编排到集群部署

Docker进阶实战&#xff1a;从多容器编排到集群部署 当你已经熟悉Docker的基本操作后&#xff0c;面对的下一个挑战往往是&#xff1a;如何管理多个容器的协作&#xff1f;如何实现容器的集群化部署与扩展&#xff1f;如何保证服务的高可用&#xff1f; 一、Docker Compose&…

【Linux文件操作】文件操作系统调用

目录 一、文件创建&#xff08;creat 系统调用&#xff09;​ 1.1 函数原型 1.2 参数说明​ 1.3 返回值​ 1.4 使用示例 二、文件打开&#xff08;open 系统调用&#xff09;​ 2.1 函数原型 2.2 参数说明​ 2.3 返回值​ 2.4 使用示例 三、文件读写&#xff08;read 和 write …

FreeRTOS源码分析六:vTaskDelay vs xTaskDelayUntil任务延时

系列文章目录 FreeRTOS源码分析一&#xff1a;task创建&#xff08;RISCV架构&#xff09; FreeRTOS源码分析二&#xff1a;task启动&#xff08;RISCV架构&#xff09; FreeRTOS源码分析三&#xff1a;列表数据结构 FreeRTOS源码分析四&#xff1a;时钟中断处理响应流程 Free…

Linux学习-应用软件编程(fread/fwrite,流定义相关接口)

freadsize_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能按块从文件读取数据&#xff0c;从文件中读 nmemb 个、每个 size 字节的元素&#xff0c;存入 ptr 指向的内存。参数- ptr &#xff1a;存储读取数据的内存首地址&#xff08;需提前分配足够…

IP分片(IP Fragmentation)

目录 一、核心概念:MTU与分片的必要性 二、IP分片的关键字段(IPv4头部) 三、分片与重组流程 1. 分片过程(发送端或中间路由器) 2. 重组过程(接收端) 四、IPv4与IPv6分片的差异 五、分片的潜在问题与风险 六、总结 一、传输效率降低,带宽开销增加 二、可靠性降低,数据丢…