拖拽Devexpress的GridControl的行到PanelControl
来源:互联网 发布:鲸鱼宝网络不给力 编辑:程序博客网 时间:2024/05/21 17:21
使用Dev的GridControl绑定显示数据比较容易,不再叙述。其实拖放操作涉及到拖放源,拖放目标两者。触发拖动操作的鼠标按键,获取源数据后转成任何可视的对象到目标,才是整个拖放过程的结束。
首先获取源数据,我们使用gridView的MouseMove,MouseDown事件,根据鼠标的点击获取当前点击的“热区”;
// 获取拖拽设备数据,Equipment为实体类 Equipment GetDragData(GridView view) { int[] selection = view.GetSelectedRows(); if (selection == null) return null; Equipment equipment = new Equipment(); DataRow row = view.GetDataRow(selection[0]); if (row != null) { equipment.id = Convert.ToInt32(row[0].ToString()); equipment.eNumber = row[1] == null ? 0 : Convert.ToInt32(row[1].ToString()); equipment.eName = row[2] == null ? "" : row[2].ToString(); } return equipment; }
gvEquipmentList_MouseMove事件:
private void gvEquipmentList_MouseMove(object sender, MouseEventArgs e) { GridView view = sender as GridView; if (e.Button == MouseButtons.Left && downHitInfo != null) { Size dragSize = SystemInformation.DragSize; Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X - dragSize.Width / 2, // 计算拖放区域大小 downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize); if (!dragRect.Contains(new Point(e.X, e.Y))) { view.GridControl.DoDragDrop(GetDragData(view), DragDropEffects.All); downHitInfo = null; } } }
gvEquipmentList_MouseDown事件:
GridHitInfo downHitInfo = null; private void gvEquipmentList_MouseDown(object sender, MouseEventArgs e) { GridView view = sender as GridView; if (view == null) return; downHitInfo = null; // 根据光标位置计算热区域 GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y)); if (Control.ModifierKeys != Keys.None) return; if (e.Button == System.Windows.Forms.MouseButtons.Left && hitInfo.InRow && hitInfo.HitTest != GridHitTest.RowIndicator) // 判断是否按下的是否是鼠标左键;热区是否是行;当前选择的不是行标题 { downHitInfo = hitInfo; } }
现在成功获取的数据源为object对象,它将在panelControl的DragDrop事件中 通过转换成Equipment对象
/// <summary> /// 拖放操作完成 pcStationLayoutSet 为PanelControl 承载拖放过来的数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void pcStationLayoutSet_DragDrop(object sender, DragEventArgs e) { Equipment data = e.Data.GetData(typeof(Equipment)) as Equipment; // 转换成Equipment对象 // 添加一个LayoutControl控件 LayoutControl control = new LayoutControl(); LayoutControlItem item = new LayoutControlItem(control, new SimpleButton() { Width = 20, Height = 40, Text = data.eName, Tag = data }); item.Text = data.eName; item.Padding = new DevExpress.XtraLayout.Utils.Padding(0); item.TextLocation = DevExpress.Utils.Locations.Bottom; control.Height = 65; // 鼠标按下 control.MouseDown += new MouseEventHandler(control_MouseDown); // 控件拖动事件 control.MouseMove += new MouseEventHandler(control_MouseMove); // 选择事件 control.MouseClick += new MouseEventHandler(control_MouseClick); // 添加到pcStationLayoutSet this.pcStationLayoutSet.Controls.Add(control); // 显示到当前鼠标拖动的位置 control.Location = control.Parent.PointToClient(new Point(e.X, e.Y)); }这里 没一个拖放过来的Equipment的属性将作为LayoutControl的部分属性,当然,此处可以使用任务可以视化的控件。
部分layoutControl事件
/// <summary> /// 鼠标选择 改变背景色 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void control_MouseClick(object sender, MouseEventArgs e) { // 选择设备时 if (e.Button == System.Windows.Forms.MouseButtons.Left && (Control.ModifierKeys & Keys.Control) == Keys.Control) { (sender as LayoutControl).BackColor = Color.Red; (sender as LayoutControl).Tag = true; } } // 移动,计算位置 void control_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { Point p2 = Control.MousePosition;//获取鼠标光标的位置,以屏幕坐标表示 p2.Offset(p.X, p.Y);//设置偏移 //指定在父控件的区域内将指定屏幕点的位置,计算成工作区坐标 ((Control)sender).Location = ((Control)sender).Parent.PointToClient(p2); } } Point p = new Point(); void control_MouseDown(object sender, MouseEventArgs e) { p.X = -e.X; p.Y = -e.Y; }
Dev中涉及拖放的操作,原理与WPF中一样。只不过感觉比WPF中麻烦点,麻烦在计算位置上,还有就是性能上觉得比WPF差。
0 0
- 拖拽Devexpress的GridControl的行到PanelControl
- Devexpress 设置PanelControl GroupControl的背景颜色 BackColor
- DevExpress GridControl的使用
- DevExpress的GridControl的行编辑
- devexpress的GridControl控件实时保存数据到DataSource
- Devexpress立即结束GridControl的编辑并更新到数据源
- DevExpress的控件GridControl光标定位到某一个单元格
- DevExpress控件的GridControl控件
- DevEXpress中的GridControl 的使用方法
- DevExpress中的GridControl的使用
- DevExpress Gridcontrol的使用小结
- DevExpress GridControl 按扭列的操作
- [DevExpress]GridControl分页的实现
- DevExpress GridControl 设置单元格 某一行的背景色
- DevExpress GridControl 设置单元格 某一行的背景色
- DevExpress GridControl List绑定方式下新增行的方法
- devexpress的gridcontrol控件打印eco数据
- devexpress的gridcontrol控件用法搜集
- vSphere起始篇——介绍实验环境
- android之生命周期(二)onPause()、onResume()、onStop()详解:有实例
- ubuntu 安装amqp扩展
- Part2 MapGIS云GIS软件组件开发入门
- javascript面试题-1
- 拖拽Devexpress的GridControl的行到PanelControl
- 全面了解TLC NAND技术以及市场现状
- 如何正确的在Android中存储特定应用文件
- STL中的常用的vector,map,set,Sort用法
- 计算机网络的分类
- ngnix控制IP访问
- Python错误小结(二)
- 关于考证
- Android ANR异常