当前位置: 首页 > java >正文

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.xdnf.cn/news/17329.html

相关文章:

  • mysql的InnoDB索引总结
  • Oracle 关闭 impdp任务
  • JavaScript 伪装者现形记:类数组的真面目!
  • 数据结构与算法
  • Maven私服搭建--Nexus-3.82.0 Linux环境
  • 多场景两阶段分布式鲁棒优化模型、数据驱动的综合能源系统
  • 一文入门 matplotlib:从基础图表到数据可视化初体验
  • HTTP 协议升级(HTTP Upgrade)机制
  • 力扣300:最长递增子序列
  • Java 八大经典排序算法全解析
  • 小米前端笔试和面试
  • 【Unity Plugins】使用Magica Cloth 2 实现头发和服饰的效果模拟
  • 玳瑁的嵌入式日记D14-0807(C语言)
  • DoubleTrouble靶机
  • QT的拖拽功能
  • 指针——练习
  • 一文解读“Performance面板”前端性能优化工具基础用法!
  • 数字孪生系统让汽车工厂虚实联动预测维护少停机
  • S7-1200 串行通信介绍
  • Android-Kotlin基础(Jetpack③-LiveData)
  • 连续最高天数的销售额(动态规划)
  • Pytest项目_day07(pytest)
  • 《C语言》函数练习题--2
  • Android 之 Jetpack WorkManager
  • 突破距离桎梏:5G 高清视频终端如何延伸无人机图传边界
  • 无人机光伏巡检效率提升68%!陌讯动态融合算法实战解析
  • Shuffle SOAR使用学习经验
  • ElasticSearch相关术语介绍
  • 亚远景-ISO 42001:汽车AI安全的行业标准新趋势
  • 华为开源CANN,再次释放“昇腾转向”信号