1. 启动程序,图如下:

2. 拖动 Button 后的效果如下:

3. 程序源代码如下:

public partial class TestControlDrag : Form{/// <summary>/// 该指标指示被拖动的对象是否进入了控件的边界/// </summary>bool bMouseDown;public TestControlDrag(){InitializeComponent();// 默认为 false,即不接受用户拖动到其上的控件this.groupBox1.AllowDrop = true;this.groupBox2.AllowDrop = true;// 拖动对象进入控件边界时触发this.groupBox1.DragEnter += new DragEventHandler(groupBox_DragEnter);this.groupBox2.DragEnter += new DragEventHandler(groupBox_DragEnter);// 完成拖动时触发this.groupBox1.DragDrop += new DragEventHandler(groupBox_DragDrop);this.groupBox2.DragDrop += new DragEventHandler(groupBox_DragDrop);}private void TestControlDrag_Load(object sender, EventArgs e){CreateControls();}/// <summary>/// 生成一定数量的控件,本例中使用 Button/// 注册 Button 的鼠标点击事件/// </summary>private void CreateControls(){int x = 15;int y = 15;Button btn = null;for (int i = 1; i <= 15; i++){btn = new Button();btn.Left = x;btn.Top = y;btn.Text = "Button " + i;btn.Width = 100;btn.Height = 50;x += btn.Width + 15;if (btn.Width > groupBox1.Width - x){x = 15;y += btn.Height + 15;}btn.AllowDrop = true; // 默认为 false,即不可拖动btn.MouseDown += new MouseEventHandler(btn_MouseDown);this.groupBox1.Controls.Add(btn);}}/// <summary>/// 拖动对象进入本控件的边界/// </summary>void groupBox_DragEnter(object sender, DragEventArgs e){e.Effect = DragDropEffects.Move;bMouseDown = true;}/// <summary>/// 拖放操作完成/// </summary>void groupBox_DragDrop(object sender, DragEventArgs e){if (bMouseDown){// 从事件参数 DragEventArgs 中获取被拖动的元素Button btn = (Button)e.Data.GetData(typeof(Button));GroupBox grp = (GroupBox)btn.Parent;grp.Controls.Remove(btn);((GroupBox)sender).Controls.Add(btn);RefreshControls(new Control[] { grp, (GroupBox)sender });bMouseDown = false;}}/// <summary>/// 按下鼠标后即开始执行拖放操作/// 这里指定了拖放操作的最终效果为一个枚举值: Move/// </summary>void btn_MouseDown(object sender, MouseEventArgs e){Button btn = (Button)sender;btn.DoDragDrop(btn, DragDropEffects.Move);}/// <summary>/// 对控件中的项进行排列/// </summary>private void RefreshControls(Control[] p){foreach (Control control in p){int x = 15;int y = 15;Button btn = null;foreach (Control var in control.Controls){btn = var as Button;btn.Left = x;btn.Top = y;x += btn.Width + 15;if (btn.Width > control.Width - x){x = 15;y += btn.Height + 15;}}}}}

WinForm 实现两个容器之间控件的拖动及排列(图文)相关推荐

  1. WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享...

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/chinahuyong/article/details/47395633 WinForm容器内控件批量 ...

  2. WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享

    WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享 在WinForm程序中,我们有时需要对某容器内的所有控件做批量操作.如批量判断是否允许为空?批量设置为只读.批量设置 ...

  3. qt 容器组控件 Containers

    qt 容器组控件 Containers 控件名: Group Box:组合框,提供带有标题的组合框框架 Scroll Area:滚动区域 Tool Box:工具箱 Tab Widget:标签小部件 S ...

  4. 【Qt开发笔记】Qt自定义控件开发与使用,自定义控件实现容器与控件内布局

    1.开发环境 Qt版本:Qt 4.8.7 编译器:MinGw 系统:Windows 2.创建Qt4自定义控件 创建一个Qt自定义控件工程. 工程名为Custom. 控件类取名Custom. 然后完成创 ...

  5. Winform开发框架之肖像显示保存控件的实现

    我们在开发一些Winform程序的时候,除了常规的显示普通数据外,有的时候需要显示一些人员肖像或者一些车辆等物体的图片,一般这些内容较小,所以以二进制存储在数据库是一个不错的方案.但由于它们虽然很常用 ...

  6. Android仿抖音加载框之两颗小球转动控件

    Android仿抖音加载框之两颗小球转动控件 本篇文章已授权微信公众号 hongyangAndroid(鸿洋)独家发布. 效果图 安卓版抖音v2.5加载框: 本控件效果图: 使用方法 源码地址:And ...

  7. c#winform演练 ktv项目 关注MediaPlayer控件的状态

    c#winform演练 ktv项目 关注MediaPlayer控件的状态 获取媒体控件的状态 一般情况下需要int类型的值,用于方便的判断 (int)媒体控件.playState 例子 弹出媒体控件的 ...

  8. 在Winform中使用MoonPdfLib(Wpf控件)

    在Winform中使用MoonPdfLib(Wpf控件) 引用WindowsFormsIntegration.dll,使用ElementHost类的Child属性关联wpf控件 1.新建winform ...

  9. (一)C#Winform导入Excel数据到datagridview控件

    C#Winform导入Excel数据到datagridview控件 #此次导入Excel数据借助了ExcelDataReader插件.(由于我需要的是打开工作簿时能够选择工作表绑定于datagridv ...

最新文章

  1. ASP.NET中WebForm组件CheckBoxList编程
  2. 深圳市中心迎来首批RoboTaxi,元戎启行正式开放运营
  3. word图片自动换行不亮_Word自动换行版式不变形
  4. pytorch下载mnist超时解决方案
  5. 去哪儿网产品经理的专属心得:产品经理的核心价值
  6. pyquery获取不到网页完整源代码_PyQuery 详解
  7. 结对-贪吃蛇游戏-设计文档
  8. Entity Framework 批量插入
  9. java对xml解析_Java中对xml的解析
  10. 汇编:汇编语言实现冒泡排序(loop指令实现)
  11. python 3 json 序列化
  12. [原创]c# 加解密通用类
  13. 工具-WPT(Windows Performances Tool Kit) References
  14. 二维光子晶体带隙仿真Matlab完全程序_平面波展开法
  15. sqlplus工具linux,sqlplus 工具的使用
  16. MAX485芯片收发详解 实现485通信
  17. 程序猿生存指南-55 初为人师
  18. 4.3 CPU性能侦测
  19. 敬业签云便签提示“基础连接已关闭,发送时发生错误”如何解决
  20. ios中SQLite3的基本操作

热门文章

  1. Miniconda3的环境配置
  2. HDLBits 系列(36)Arbitration circuit implemented by FSM
  3. 数据库基础 (六)单表查询进阶
  4. android w700
  5. 《Visual Studio程序员箴言》笔记
  6. 1.1.3 性能指标-速率 带宽 吞吐量
  7. Jupyter Notebook 中查看当前 运行哪个python
  8. matlab把cell矩阵转换成能处理的数据
  9. 计算机c盘属性不显示安全选项,win7系统中文件夹属性安全选项卡空白的解决方法...
  10. 语义分割常用loss介绍——及pytorch实现