拖拽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
原创粉丝点击