//树表格拖拽到表格
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;
}
}
}
///
/// 说明:源树表格鼠