/******************************
* 说明:表格拖拽到树结构
* 创建人:龚宇超
* 创建日期:2017-11-13
* 修改人:
* 修改日期:
* 修改备注:
* 版本:1.0.0.0
******************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using DevExpress.XtraGrid.Views.Grid;
using System.Windows.Forms;
using Lskj.Data;
using System.Drawing;
using DevExpress.Utils;
using System.Data;
namespace Lskj.Control.Model
{
///
/// 表格拖拽到树结构
///
public class GridDragTree : IDisposable
{
private bool _disposed;
///
/// 拖动位置
///
private GridHitInfo _hitInfo;
///
/// 拖动数据源
///
private GridView _gridView;
///
/// 拖动目标源
///
private TreeView _treeView;
public bool CanDragParentNode = false;
///
/// 表格数据拖动完成
///
public event GridDragTreeCompleteEventHandler OnDragComplete;
public GridDragTree(GridView gridView, TreeView treeView)
{
this._gridView = gridView;
this._treeView = treeView;
if (this._gridView == null || this._treeView == null)
return;
this._gridView.MouseDown += new MouseEventHandler(gridView_MouseDown);
this._gridView.MouseMove += new MouseEventHandler(gridView_MouseMove);
this._treeView.HideSelection = false;
this._treeView.AllowDrop = true;
this._treeView.DragOver += new DragEventHandler(treeView_DragOver);
this._treeView.DragDrop += new DragEventHandler(treeView_DragDrop);
if (this._gridView.GridControl != null)
{
this._gridView.GridControl.Disposed += OnOwnerDisposed;
}
this._treeView.Disposed += OnOwnerDisposed;
}
private void OnOwnerDisposed(object sender, EventArgs e)
{
Dispose();
}
///
/// 模块关闭时解除源表格和目标树的拖拽事件。
///
public void Dispose()
{
if (_disposed) return;
_disposed = true;
if (_gridView != null)
{
_gridView.MouseDown -= gridView_MouseDown;
_gridView.MouseMove -= gridView_MouseMove;
if (_gridView.GridControl != null)
{
_gridView.GridControl.Disposed -= OnOwnerDisposed;
}
}
if (_treeView != null)
{
_treeView.DragOver -= treeView_DragOver;
_treeView.DragDrop -= treeView_DragDrop;
_treeView.Disposed -= OnOwnerDisposed;
}
OnDragComplete = null;
_hitInfo = null;
_gridView = null;
_treeView = null;
}
///
/// 说明:获取表格选中行数据
/// 创建人:龚宇超
/// 创建日期:2017-11-13
/// 修改人:
/// 修改日期:
/// 修改备注:
/// 版本:1.0
///
/// The row handles.
/// DataRow[].
private DataRow[] GetGridSelectRows(int[] rowHandles)
{
List rows = new List();
foreach (int handle in rowHandles)
{
DataRow row = this._gridView.GetDataRow(handle);
rows.Add(row);
}
return rows.ToArray();
}
///
/// 说明:GridView 鼠标按下
/// 创建人:龚宇超
/// 创建日期:2017-11-13
/// 修改人:
/// 修改日期:
/// 修改备注:
/// 版本:1.0
///
/// The source of the event.
/// The instance containing the event data.
protected void gridView_MouseDown(object sender, MouseEventArgs e)
{
this._hitInfo = null;
if (System.Windows.Forms.Control.ModifierKeys != Keys.None) return;
GridView gridView = sender as GridView;
GridHitInfo hitInfo = gridView.CalcHitInfo(new Point(e.X, e.Y));
if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0)
{
this._hitInfo = hitInfo;
}
}
///
/// 说明:鼠标移动
/// 创建人:龚宇超
/// 创建日期:2017-11-13
/// 修改人:
/// 修改日期:
/// 修改备注:
/// 版本:1.0
///
/// The source of the event.
/// The instance containing the event data.
protected void gridView_MouseMove(object sender, MouseEventArgs e)
{
GridView gridView = sender as GridView;
if (e.Button == MouseButtons.Left && this._hitInfo != null)
{
Size dragSize = SystemInformation.DragSize;
Rectangle dragRect = new Rectangle(new Point(this._hitInfo.HitPoint.X - dragSize.Width / 2, this._hitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
if (!dragRect.Contains(new Point(e.X, e.Y)))
{
object row = gridView.GetRow(this._hitInfo.RowHandle);
gridView.GridControl.DoDragDrop(row, DragDropEffects.Move);
this._hitInfo = null;
DXMouseEventArgs.GetMouseArgs(e).Handled = true;
}
}
}
///
/// 说明:
/// 创建人:龚宇超
/// 创建日期:2017-11-13
/// 修改人:
/// 修改日期:
/// 修改备注:
/// 版本:1.0
///
/// The source of the event.
/// The instance containing the event data.
protected void treeView_DragOver(object sender, DragEventArgs e)
{
TreeView treeView = sender as TreeView;
treeView.Select();
TreeNode treeNode = treeView.GetNodeAt(treeView.PointToClient(new Point(e.X, e.Y)));
if (treeNode != null)
{
bool isLastNode = treeNode.Nodes.Count == 0;
if (!isLastNode)
{
treeNode.Expand();
}
DataRow[] rowItems = this.GetGridSelectRows(this._gridView.GetSelectedRows());
if (isLastNode || CanDragParentNode)
{
e.Effect = DragDropEffects.Move;
treeView.SelectedNode = treeNode;
}
else
{
e.Effect = DragDropEffects.None;
}
}
}
///
/// 说明:
/// 创建人:龚宇超
/// 创建日期:2017-11-13
/// 修改人:
/// 修改日期:
/// 修改备注:
/// 版本:1.0
///
/// The source of the event.
/// The instance containing the event data.
protected void treeView_DragDrop(object sender, DragEventArgs e)
{
TreeView treeView = sender as TreeView;
TreeNode treeNode = treeView.GetNodeAt(treeView.PointToClient(new Point(e.X, e.Y)));
if (treeNode == null) return;
if (treeNode.GetNodeCount(true) > 0 && !CanDragParentNode)
{
MessageUtil.Show(string.Format(ResourceKeys.UnLastTreeNode, treeNode.Text));
return;
}
if (!e.Data.GetDataPresent(typeof(TreeNode)))
{
if (OnDragComplete != null)
{
GridDragTreeArgs args = new GridDragTreeArgs();
args.GridViewObj = this._gridView;
args.TreeViewObj = this._treeView;
args.GridViewSelectRows = this.GetGridSelectRows(this._gridView.GetSelectedRows());
args.SelectTreeNode = treeNode;
OnDragComplete(sender, args);
}
}
}
}
}