//树表格拖拽到表格 using DevExpress.Utils; using DevExpress.XtraGrid; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Grid.ViewInfo; using DevExpress.XtraTreeList; using DevExpress.XtraTreeList.Nodes; using Lskj.Data; using Lskj.Util; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Lskj.Control.Model { public class TreeGridDragGrid { /// /// 拖动位置 /// private GridHitInfo _hitInfo; /// /// 拖拽时节点 /// TreeListHitInfo downHitInfo = null; /// /// 拖动数据源 /// private TreeList _sourceTreeList; /// /// 拖动目标源 /// private GridView _targetGridView; /// /// 是否正在拖拽 /// private bool _draging = false; public bool isDragCond = true; /// /// 是否正在拖拽 /// public bool Draging { get { return _draging; } set { _draging = value; } } public bool CanDragParentNode = false; public bool isDropColorVisble = false; /// /// 表格数据拖动完成 /// public event TreeGridDragGridCompleteEventHandler OnDragComplete; public TreeGridDragGrid(TreeList treeList, GridView gridView) { this._sourceTreeList = treeList; this._targetGridView = gridView; if (this._sourceTreeList == null || this._targetGridView == null) return; this._sourceTreeList.MouseDown += new MouseEventHandler(treeList_MouseDown); this._sourceTreeList.MouseMove += new MouseEventHandler(treeList_MouseMove); this._sourceTreeList.MouseUp += new MouseEventHandler(treeList_MouseUp); //this._sourceTreeList.HideSelection = false; this._sourceTreeList.AllowDrop = false; this._targetGridView.GridControl.AllowDrop = true; this._targetGridView.GridControl.DragOver += new DragEventHandler(treeGridView_DragOver); this._targetGridView.GridControl.DragEnter += new System.Windows.Forms.DragEventHandler(targetGridView_DragEnter); this._targetGridView.GridControl.DragDrop += new DragEventHandler(targetGridView_DragDrop); } private void targetGridView_DragDrop(object sender, DragEventArgs e) { if (this.OnDragComplete != null && this._draging) { this._draging = false; this.isDragCond = true; TreeGridDragGridArgs args = new TreeGridDragGridArgs(); args.GridViewObj = this._targetGridView; args.TreeListObj = this._sourceTreeList; args.GridViewSelectRows = GetViewFocusedDataRows(); args.SelectGridRow = this._targetGridView.GetDataRow(this._targetGridView.FocusedRowHandle); this.OnDragComplete(sender, args); } } /// /// 说明:获取选中行数据 /// 创建人:龚宇超 /// 创建日期:2019-10-18 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// /// DataRow[]. public DataRow[] GetViewFocusedDataRows() { var selectNodes = this._sourceTreeList.Selection; DataRow[] dataRows = new DataRow[selectNodes.Count]; for (int i = 0; i < selectNodes.Count; i++) { TreeListNode treeNode = selectNodes[i]; DataRowView dataRowView = this._sourceTreeList.GetDataRecordByNode(treeNode) as DataRowView; dataRows[i] = dataRowView != null ? dataRowView.Row : null; } //设置了复选框这个获取所有选中的节点行 if (this._sourceTreeList.OptionsView.ShowCheckBoxes == true && this._sourceTreeList.OptionsSelection.MultiSelect == true && this._sourceTreeList.OptionsSelection.MultiSelectMode == TreeListMultiSelectMode.RowSelect) { List TreeListNodeList = this._sourceTreeList.GetAllCheckedNodes(); dataRows = new DataRow[TreeListNodeList.Count]; for (int i = 0; i < TreeListNodeList.Count; i++) { TreeListNode treeNode = TreeListNodeList[i]; DataRowView dataRowView = this._sourceTreeList.GetDataRecordByNode(treeNode) as DataRowView; dataRows[i] = dataRowView != null ? dataRowView.Row : null; } } return dataRows; } private void targetGridView_DragEnter(object sender, DragEventArgs e) { if (isDragCond) { e.Effect = DragDropEffects.Move; } else { e.Effect = DragDropEffects.None; } } private void treeGridView_DragOver(object sender, DragEventArgs e) { TreeList treelist = sender as TreeList; if (treelist != null) { e.Effect = DragDropEffects.Move; } GridControl targetControl = (sender as GridControl); GridView targetGrid = targetControl.FocusedView as GridView; Point gcPoint = targetControl.PointToScreen((sender as GridControl).Location); Point pt = new Point(e.X - gcPoint.X, e.Y - gcPoint.Y); _hitInfo = targetGrid.CalcHitInfo(pt); if (_hitInfo == null || _hitInfo.RowHandle < 0) return; if (!isDropColorVisble) targetGrid.SelectRow(_hitInfo.RowHandle); targetGrid.FocusedRowHandle = _hitInfo.RowHandle; } /// /// 说明:源表格鼠标放开 /// 创建人: /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void treeList_MouseUp(object sender, MouseEventArgs e) { this._draging = false; } /// 说明:源表格鼠标移动 /// 创建人: /// 创建日期: /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void treeList_MouseMove(object sender, MouseEventArgs e) { TreeList treelist = sender as TreeList; if (e.Button == MouseButtons.Left && downHitInfo != null) { if (_sourceTreeList.Selection.Count == 0) return; Size dragSize = SystemInformation.DragSize; Rectangle dragRect = new Rectangle(new Point(downHitInfo.MousePoint.X - dragSize.Width / 2, downHitInfo.MousePoint.Y - dragSize.Height / 2), dragSize); if (!dragRect.Contains(new Point(e.X, e.Y))) { List node = new List(); foreach (TreeListNode n in _sourceTreeList.Selection) { node.Add(n); } treelist.DoDragDrop(node, DragDropEffects.Move); downHitInfo = null; DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true; } } } /// /// 说明:源树表格鼠标按下 /// 创建人: /// 创建日期:2023-3-20 /// 修改人: /// 修改日期: /// 修改备注: /// 版本:1.0 /// private void treeList_MouseDown(object sender, MouseEventArgs e) { //this._sourceTreeList.AllowDrop = false; //this._targetGridView.GridControl.AllowDrop = true; TreeList treelist = sender as TreeList; downHitInfo = null; _hitInfo = null; TreeListHitInfo hitInfo = treelist.CalcHitInfo(new Point(e.X, e.Y)); // if (Control.ModifierKeys != Keys.None) return; if (e.Button == MouseButtons.Left && hitInfo != null) { StaticControl.SourceDragGridView = null; this._draging = true; downHitInfo = hitInfo; } } } }