WinForm拖拽控件生成副本的解决方法
本文讲述了WinForm中实现拖拽效果的功能,即在WinForm中有一个Button,可以实现拖拽这个Button到目标位置后生成一个该控件的副本的功能。具体操作步骤如下:
要实现该功能主要分成如下三步:
1)确定被拖拽的对象:这里是Button(要使得Button被单击之后可以拖拽,那么必须处理其MouseDown事件,同时调用其DoDragDrop——该函数接受两个参数:i)要拖动的数据。ii)拖动的效果(该效果是2“目标位置”所能够接受的效果,是一个枚举值):
C#代码如下:
Button1.DoDragDrop(Button1, DragDropEffects.Copy || DragDropEffects.Move); //形成拖拽效果,移动+拷贝的组合效果
VB.NET页面代码如下:
Button1.DoDragDrop(Button1, DragDropEffects.Copy Or DragDropEffects.Move) '形成拖拽效果,移动+拷贝的组合效果
2)目标位置:这里是Form窗体自身。为了使得和Windows资源管理器中实现的文件拖拽效果一样(即拖拽一个文件到目标位置的中途,鼠标出现“+”号的效果)。那么应当处理DragEnter事件——即拖拽控件途中进入Form体内把效果设置成Copy的效果。
C#代码如下:
private void Form1_DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e) { //当Button被拖拽到WinForm上时候,鼠标效果出现 if ((e.Data.GetDataPresent(typeof(Button)))) { e.Effect = DragDropEffects.Copy; } }
VB.NET页面代码如下:
Private Sub Form1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter If (e.Data.GetDataPresent(GetType(Button))) Then '当Button被拖拽到WinForm上时候,鼠标效果出现 e.Effect = DragDropEffects.Copy End If End Sub
同时,为了使得Form自身支持接受拖拽传来的控件,必须设置其AllowDrag=True:
另外,一旦松开鼠标,那么拖拽过程结束。此时应当处理DragDrop事件,复制一个按钮:
C#代码如下:
private void Form1_DragDrop(System.Object sender, System.Windows.Forms.DragEventArgs e) { //拖放完毕之后,自动生成新控件 Button btn = new Button(); btn.Size = Button1.Size; btn.Location = this.PointToClient(new Point(e.X, e.Y)); //用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标 this.Controls.Add(btn); btn.Text = "按钮" + count.ToString; count = count + 1; }
VB.NET页面代码如下:
Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop '拖放完毕之后,自动生成新控件 Dim btn As New Button btn.Size = Button1.Size btn.Location = Me.PointToClient(New Point(e.X, e.Y)) '用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标 Me.Controls.Add(btn) btn.Text = "按钮" + count.ToString count = count + 1 End Sub
这里需要注意点:Location属性(指定控件放置位置的起始点)不能直接用e.X或e.Y——因为这是屏幕坐标,要根据实际的控件界面坐标进行适度转换,最简单方法是——PointToClient方法。
下面给出完整代码:
【界面如下所示】
C#代码如下:
using Microsoft.VisualBasic; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; public class Form1 { //计数变量,说明输出了第N个Button private int count = 1; private void Form1_Load(System.Object sender, System.EventArgs e) { this.AllowDrop = true; //窗体自身支持接受拖拽来的控件 } private void Button1_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) { //左键的话,标志位为true(表示拖拽开始) if ((e.Button == System.Windows.Forms.MouseButtons.Left)) { Button1.DoDragDrop(Button1, DragDropEffects.Copy | DragDropEffects.Move); //形成拖拽效果,移动+拷贝的组合效果 } } private void Form1_DragEnter(System.Object sender, System.Windows.Forms.DragEventArgs e) { //当Button被拖拽到WinForm上时候,鼠标效果出现 if ((e.Data.GetDataPresent(typeof(Button)))) { e.Effect = DragDropEffects.Copy; } } private void Form1_DragDrop(System.Object sender, System.Windows.Forms.DragEventArgs e) { //拖放完毕之后,自动生成新控件 Button btn = new Button(); btn.Size = Button1.Size; btn.Location = this.PointToClient(new Point(e.X, e.Y)); //用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标 this.Controls.Add(btn); btn.Text = "按钮" + count.ToString(); count = count + 1; } public Form1() { DragDrop += Form1_DragDrop; DragEnter += Form1_DragEnter; Load += Form1_Load; } }
VB.NET页面代码如下:
Public Class Form1 '计数变量,说明输出了第N个Button Private count As Integer = 1 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Me.AllowDrop = True '窗体自身支持接受拖拽来的控件 End Sub Private Sub Button1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown '左键的话,标志位为true(表示拖拽开始) If (e.Button = Windows.Forms.MouseButtons.Left) Then Button1.DoDragDrop(Button1, DragDropEffects.Copy Or DragDropEffects.Move) '形成拖拽效果,移动+拷贝的组合效果 End If End Sub Private Sub Form1_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragEnter If (e.Data.GetDataPresent(GetType(Button))) Then '当Button被拖拽到WinForm上时候,鼠标效果出现 e.Effect = DragDropEffects.Copy End If End Sub Private Sub Form1_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs) Handles MyBase.DragDrop '拖放完毕之后,自动生成新控件 Dim btn As New Button btn.Size = Button1.Size btn.Location = Me.PointToClient(New Point(e.X, e.Y)) '用这个方法计算出客户端容器界面的X,Y坐标。否则直接使用X,Y是屏幕坐标 Me.Controls.Add(btn) btn.Text = "按钮" + count.ToString count = count + 1 End Sub End Class
相关文章
- 这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
这篇文章主要介绍了antdesign-vue结合sortablejs实现两个table相互拖拽排序功能,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-01-09- 本篇文章是对C#中WinForm控件之Dock顺序调整进行了详细的分析介绍,需要的朋友参考下...2020-06-25
- 这篇文章主要介绍了C#实现跨线程操作控件方法,主要采用异步访问方式实现,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C# Winform中实现主窗口打开登录窗口关闭的方法,这在需要用户名密码的软件项目中是必用的一个技巧,要的朋友可以参考下...2020-06-25
- 下面小编就为大家带来一篇C# winform打开Excel文档的方法总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要给大家介绍C# winform快捷键设置技巧,涉及到C winform快捷键相关知识,对C winform知识感兴趣的朋友可以参考下本篇文章...2020-06-25
c#中Winform实现多线程异步更新UI(进度及状态信息)
本篇文章主要介绍了c#中Winform实现多线程异步更新UI(进度及状态信息) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C# 如何设置label(标签)控件的背景颜色为透明,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2020-12-08
- 这篇文章主要给大家介绍了关于c# winform异步不卡界面的实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用c#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
- 本篇文章是对C#中自定义控件的制作与使用实例进行了详细的分析介绍,需要的朋友参考下...2020-06-25
C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法
这篇文章主要介绍了C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法,本文通过Application.DoEvents()解决这个问题,并讲解了Application.DoEvents()的作用,需要的朋友可以参考下...2020-06-25- 这篇文章主要介绍了C#中winform使用相对路径读取文件的方法,实例分析了C#使用相对路径读取文件的技巧与实际应用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了Bootstrap树形控件使用方法,感兴趣的小伙伴们可以参考一下...2016-01-29
- 这篇文章主要介绍了C#实现根据指定容器和控件名字获得控件的方法,其中包括了遍历与递归的应用,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了C#控件Picturebox实现鼠标拖拽功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了一百多行代码实现react拖拽hooks,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-21
- 这篇文章主要介绍了C#多线程与跨线程访问界面控件的方法,实例分析了C#多线程与跨线程访问空间的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
Repeater事件OnItemCommand取得行内控件的方法
这篇文章主要介绍了Repeater事件OnItemCommand取得行内控件的方法,有需要的朋友可以参考一下...2021-09-22winform中的ListBox和ComboBox绑定数据用法实例
这篇文章主要介绍了winform中的ListBox和ComboBox绑定数据用法,实例分析了将集合数据绑定到ListBox和ComboBox控件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25