Files
lserp_cs_6.0/插件库/Lskj.Control/Model/BandedGridDragGrid.cs
T

560 lines
23 KiB
C#

/******************************
* 说明:表格拖拽到表格
* 创建人:龚宇超
* 创建日期:2017-11-13
* 修改人:
* 修改日期:
* 修改备注:
* 版本:1.0.0.0
******************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using System.Drawing;
using System.Windows.Forms;
using DevExpress.Utils;
using System.Data;
using DevExpress.XtraGrid;
using Lskj.Util;
using DevExpress.XtraGrid.Views.BandedGrid;
namespace Lskj.Control.Model
{
/// <summary>
/// 表格拖拽到表格
/// </summary>
public class BandedGridDragGrid : IDisposable
{
private bool _disposed;
internal static void DisposeRegistrations(
Dictionary<BandedGridView, List<BandedGridDragGrid>> sourceRegistrations,
Dictionary<GridView, List<BandedGridDragGrid>> targetRegistrations,
BandedGridView sourceGridView,
GridView targetGridView)
{
DisposeSourceRegistrations(sourceRegistrations, sourceGridView);
DisposeTargetRegistrations(targetRegistrations, targetGridView);
}
private static void DisposeSourceRegistrations(
Dictionary<BandedGridView, List<BandedGridDragGrid>> registrations,
BandedGridView gridView)
{
foreach (KeyValuePair<BandedGridView, List<BandedGridDragGrid>> entry in registrations.ToList())
{
bool removeKey = ReferenceEquals(entry.Key, gridView);
foreach (BandedGridDragGrid registration in entry.Value.ToList())
{
if (removeKey || registration == null || registration._disposed || registration.References(gridView))
{
if (registration != null)
registration.Dispose();
entry.Value.Remove(registration);
}
}
if (removeKey || entry.Value.Count == 0)
registrations.Remove(entry.Key);
}
}
private static void DisposeTargetRegistrations(
Dictionary<GridView, List<BandedGridDragGrid>> registrations,
GridView gridView)
{
foreach (KeyValuePair<GridView, List<BandedGridDragGrid>> entry in registrations.ToList())
{
bool removeKey = ReferenceEquals(entry.Key, gridView);
foreach (BandedGridDragGrid registration in entry.Value.ToList())
{
if (removeKey || registration == null || registration._disposed || registration.References(gridView))
{
if (registration != null)
registration.Dispose();
entry.Value.Remove(registration);
}
}
if (removeKey || entry.Value.Count == 0)
registrations.Remove(entry.Key);
}
}
internal bool References(GridView gridView)
{
return gridView != null &&
(ReferenceEquals(_sourceGridView, gridView) ||
ReferenceEquals(_targetGridView, gridView));
}
/// <summary>
/// 是否正在拖拽
/// </summary>
private bool _draging = false;
/// <summary>
/// 拖动位置
/// </summary>
private GridHitInfo _hitInfo;
/// <summary>
/// 当前操作的GridView
/// </summary>
private BandedGridView _sourceGridView;
/// <summary>
/// 目标GridView
/// </summary>
private GridView _targetGridView;
/// <summary>
/// 拖动完成后调用
/// </summary>
public event BandedGridFragGridCompleteEventHandler OnDragComplete;
/// <summary>
/// 顺序值的集合
/// </summary>
private List<int> DragHander = new List<int>();
public bool isDropColorVisble = false;
/// <summary>
/// 外部条件是否允许拖拽
/// </summary>
public bool isDragCond = true;
/// <summary>
/// Initializes a new instance of the <see cref="BandedGridDragGrid"/> class.
/// </summary>
/// <param name="curGridView">当前GridView</param>
/// <param name="tarGridView">目标GridView.</param>
public BandedGridDragGrid(BandedGridView sourceView, GridView targetView)
{
this._sourceGridView = sourceView;
this._targetGridView = targetView;
//记录所有拖拽类到来源表中,后每次进入目标表禁用其他拖拽类的拖拽事件
if (StaticBandedControl.BandedGridViewDragGridDic.ContainsKey(sourceView))
{
List<BandedGridDragGrid> BandedGridDragGrids = StaticBandedControl.BandedGridViewDragGridDic[sourceView];
if (!BandedGridDragGrids.Contains(this))
{
BandedGridDragGrids.Add(this);
}
}
else
{
List<BandedGridDragGrid> BandedGridDragGrids = new List<BandedGridDragGrid>();
BandedGridDragGrids.Add(this);
StaticBandedControl.BandedGridViewDragGridDic.Add(sourceView, BandedGridDragGrids);
}
if (StaticBandedControl.BandedTargetViewDragGridDic.ContainsKey(targetView))
{
List<BandedGridDragGrid> BandedGridDragGrids = StaticBandedControl.BandedTargetViewDragGridDic[targetView];
if (!BandedGridDragGrids.Contains(this))
{
BandedGridDragGrids.Add(this);
}
}
else
{
List<BandedGridDragGrid> BandedGridDragGrids = new List<BandedGridDragGrid>();
BandedGridDragGrids.Add(this);
StaticBandedControl.BandedTargetViewDragGridDic.Add(targetView, BandedGridDragGrids);
}
if (this._sourceGridView == null || this._targetGridView == null) return;
this._sourceGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(sourceGridView_MouseDown);
this._sourceGridView.MouseMove += new System.Windows.Forms.MouseEventHandler(sourceGridView_MouseMove);
this._sourceGridView.MouseUp += new System.Windows.Forms.MouseEventHandler(sourceGridView_MouseUp);
this._sourceGridView.RowClick += OnRowClick;
this._targetGridView.GridControl.AllowDrop = true;
this._targetGridView.GridControl.DragOver += new DragEventHandler(gridControl_DragOver);
this._targetGridView.GridControl.DragEnter += new System.Windows.Forms.DragEventHandler(gridControl_DragEnter);
this._targetGridView.GridControl.DragDrop += new System.Windows.Forms.DragEventHandler(gridControl_DragDrop);
this._targetGridView.GridControl.DragLeave += new EventHandler(gridControl_DragLeave);
this._sourceGridView.Disposed += OnGridViewDisposed;
if (!ReferenceEquals(this._sourceGridView, this._targetGridView))
{
this._targetGridView.Disposed += OnGridViewDisposed;
}
}
private void OnGridViewDisposed(object sender, EventArgs e)
{
Dispose();
}
public void Dispose()
{
if (_disposed)
{
return;
}
_disposed = true;
BandedGridView sourceGridView = _sourceGridView;
GridView targetGridView = _targetGridView;
if (sourceGridView != null)
{
sourceGridView.MouseDown -= sourceGridView_MouseDown;
sourceGridView.MouseMove -= sourceGridView_MouseMove;
sourceGridView.MouseUp -= sourceGridView_MouseUp;
sourceGridView.RowClick -= OnRowClick;
sourceGridView.Disposed -= OnGridViewDisposed;
}
if (targetGridView != null)
{
if (targetGridView.GridControl != null)
{
targetGridView.GridControl.DragOver -= gridControl_DragOver;
targetGridView.GridControl.DragEnter -= gridControl_DragEnter;
targetGridView.GridControl.DragDrop -= gridControl_DragDrop;
targetGridView.GridControl.DragLeave -= gridControl_DragLeave;
}
if (!ReferenceEquals(sourceGridView, targetGridView))
{
targetGridView.Disposed -= OnGridViewDisposed;
}
}
RemoveRegistration(
StaticBandedControl.BandedGridViewDragGridDic,
sourceGridView,
this);
RemoveRegistration(
StaticBandedControl.BandedTargetViewDragGridDic,
targetGridView,
this);
if (ReferenceEquals(
StaticBandedControl.SourceDragBandedGridView,
sourceGridView))
{
StaticBandedControl.SourceDragBandedGridView = null;
}
OnDragComplete = null;
DragHander.Clear();
_hitInfo = null;
_sourceGridView = null;
_targetGridView = null;
}
private static void RemoveRegistration<TKey>(
Dictionary<TKey, List<BandedGridDragGrid>> registrations,
TKey key,
BandedGridDragGrid registration)
where TKey : class
{
if (key == null)
{
return;
}
List<BandedGridDragGrid> registrationsForView;
if (!registrations.TryGetValue(key, out registrationsForView))
{
return;
}
registrationsForView.Remove(registration);
if (registrationsForView.Count == 0)
{
registrations.Remove(key);
}
}
/// <summary>
/// 点击时候判断位置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnRowClick(object sender, RowClickEventArgs e)
{
int[] dragRowsIndex = _sourceGridView.GetSelectedRows();
int newGetSelect = _sourceGridView.FocusedRowHandle;
if (dragRowsIndex.Length > 1)
{
if (DragHander.Count > dragRowsIndex.Length)
{
DragHander.Remove(newGetSelect);
}
else
{
if (dragRowsIndex.Length == 2)
{
int firstIndex = dragRowsIndex.Cast<int>().FirstOrDefault(x => x != newGetSelect);
if (!DragHander.Contains(firstIndex))
{
DragHander.Add(firstIndex);
}
DragHander.Add(newGetSelect);
}
else
{
if (!DragHander.Contains(newGetSelect))
{
DragHander.Add(newGetSelect);
}
}
}
}
else
{
DragHander.Clear();
}
}
/// <summary>
/// <para>说明:获取表格选中行数据</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="rowHandles">The row handles.</param>
/// <returns>DataRow[].</returns>
private DataRow[] GetGridSelectRows(int[] rowHandles)
{
List<DataRow> rows = new List<DataRow>();
foreach (int handle in rowHandles)
{
DataRow row = this._sourceGridView.GetDataRow(handle);
rows.Add(row);
}
return rows.ToArray();
}
/// <summary>
/// <para>说明:源表格鼠标按下</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.MouseEventArgs"/> instance containing the event data.</param>
protected void sourceGridView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
this._sourceGridView.GridControl.AllowDrop = false;
this._targetGridView.GridControl.AllowDrop = true;
this._hitInfo = null;
if (System.Windows.Forms.Control.ModifierKeys != Keys.None) return;
BandedGridView gridView = sender as BandedGridView;
GridHitInfo hitInfo = gridView.CalcHitInfo(new Point(e.X, e.Y));
if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0)
{
this._draging = true;
StaticBandedControl.SourceDragBandedGridView = gridView;
this._hitInfo = hitInfo;
}
}
/// <summary>
/// <para>说明:源表格鼠标移动</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.MouseEventArgs"/> instance containing the event data.</param>
protected void sourceGridView_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
BandedGridView gridView = sender as BandedGridView;
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 >= 0 ? this._hitInfo.RowHandle : 0);
if (row != null)
{
gridView.GridControl.DoDragDrop(row, DragDropEffects.Move);
}
this._hitInfo = null;
DXMouseEventArgs.GetMouseArgs(e).Handled = true;
}
}
}
/// <summary>
/// <para>说明:源表格鼠标放开</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.MouseEventArgs"/> instance containing the event data.</param>
protected void sourceGridView_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
StaticBandedControl.SourceDragBandedGridView = null;
this._draging = false;
}
/// <summary>
/// <para>说明:移动到目标表格上</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
private void gridControl_DragOver(object sender, DragEventArgs e)
{
GridControl gridControl = (GridControl)sender;
GridView gridView = gridControl.MainView as GridView;
this._draging = true;
if (StaticBandedControl.SourceDragBandedGridView != null && StaticBandedControl.BandedGridViewDragGridDic.ContainsKey(StaticBandedControl.SourceDragBandedGridView))
{
List<BandedGridDragGrid> BandedGridDragGrids = StaticBandedControl.BandedGridViewDragGridDic[StaticBandedControl.SourceDragBandedGridView];
foreach (BandedGridDragGrid item in BandedGridDragGrids)
{
if (item != null && item._targetGridView == gridView)
{
item._draging = true;
}
else
{
item._draging = false;
}
}
}
if (StaticBandedControl.BandedTargetViewDragGridDic.ContainsKey(gridView))
{
List<BandedGridDragGrid> BandedGridDragGrids = StaticBandedControl.BandedTargetViewDragGridDic[gridView];
foreach (BandedGridDragGrid item in BandedGridDragGrids)
{
if (item != null && StaticBandedControl.SourceDragBandedGridView != null && item._sourceGridView == StaticBandedControl.SourceDragBandedGridView)
{
item._draging = true;
}
else
{
item._draging = false;
}
}
}
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;
}
/// <summary>
/// <para>说明:离开目标表格</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
private void gridControl_DragLeave(object sender, EventArgs e)
{
this._draging = false;
}
/// <summary>
/// <para>说明:移动到目标表格</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
protected void gridControl_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (isDragCond)
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
/// <summary>
/// <para>说明:拖动完成时</para>
/// <para>创建人:龚宇超</para>
/// <para>创建日期:2017-11-13 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.Forms.DragEventArgs"/> instance containing the event data.</param>
protected void gridControl_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
if (this.OnDragComplete != null && this._draging)
{
this._draging = false;
this.isDragCond = true;
BandedGridDragGridArgs args = new BandedGridDragGridArgs();
args.SourceGridViewObj = this._sourceGridView;
args.TargetGridViewObj = this._targetGridView;
args.GridViewSelectRows = GetGridSelectRows(DragHander.Count > 1 && this._sourceGridView.GetSelectedRows().Length == DragHander.Count ? DragHander.ToArray() : this._sourceGridView.GetSelectedRows());
args.SelectGridRow = this._targetGridView.GetDataRow(this._targetGridView.FocusedRowHandle);
this.OnDragComplete(sender, args);
this._draging = false;
}
}
#region 表格第一列添加复选框
/// <summary>
/// <para>说明:表格第一列添加复选框</para>
/// <para>创建人:唐德馨</para>
/// <para>创建日期:2021-07-08 </para>
/// <para>修改人:</para>
/// <para>修改日期:</para>
/// <para>修改备注:</para>
/// <para>版本:1.0</para>
/// </summary>
/// <param name="gridColumn">The grid columnFilterPopupChecke.</param>
public static void GridAddCheckBox(GridView gridview)
{
gridview.OptionsSelection.MultiSelect = true;
gridview.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;
gridview.OptionsSelection.EnableAppearanceFocusedCell = false;
gridview.OptionsBehavior.EditorShowMode = EditorShowMode.MouseDown;
foreach (DevExpress.XtraGrid.Columns.GridColumn column in gridview.Columns)
{
GridColumnModel columnModel = (GridColumnModel)column.Tag;
if (gridview.Columns.IndexOf(column) > 0 && columnModel != null && columnModel.CanSum)
{
foreach (GridSummaryItem gridSummaryItem in column.Summary)
{
gridSummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Custom;
}
GridSummaryItem gridGroupSummaryItem = gridview.GroupSummary.Where(n => n.FieldName.Equals(column.FieldName)).FirstOrDefault();
if (gridGroupSummaryItem != null)
{
gridGroupSummaryItem.SummaryType = DevExpress.Data.SummaryItemType.Custom;
}
}
}
}
#endregion
}
}