using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DevExpress.XtraGrid; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraGrid.Views.Grid.ViewInfo; using CommonLib; namespace Lskj.Common { public class GridDragTree { private string SQLDT1; private string filedKey; private DataRow sdkModel; public GridDragTree(Form thisForm, GridControl grid, TreeView target, DragEventHandler Complete, DataRow sdkModel, string SQLDT1, string filedKey) { opForm = thisForm; currentGridView = (GridView)grid.FocusedView; dragComplete = Complete; grid.FocusedView.MouseDown += new MouseEventHandler(gridMouseDown); grid.FocusedView.MouseMove += new MouseEventHandler(gridMouseMove); target.HideSelection = false; target.DragOver += new DragEventHandler(objDragOver); target.DragDrop += new DragEventHandler(objDragDrop); target.AllowDrop = true; this.sdkModel = sdkModel; this.SQLDT1 = SQLDT1; this.filedKey = filedKey; } private GridHitInfo downHitInfo = null; private GridView currentGridView = null; Form opForm = null; DragEventHandler dragComplete = null; private void gridMouseDown(object sender, MouseEventArgs e) { GridView view = sender as GridView; downHitInfo = null; GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y)); if (Control.ModifierKeys != Keys.None) return; if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0) downHitInfo = hitInfo; } private void gridMouseMove(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))) { object row = view.GetRow(downHitInfo.RowHandle); view.GridControl.DoDragDrop(row, DragDropEffects.Move); downHitInfo = null; DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true; } } } private void objDragOver(object sender, DragEventArgs e) { (sender as TreeView).Select(); e.Effect = DragDropEffects.Move; TreeNode tn = null; Point pt = new Point(); pt.X = e.X; pt.Y = e.Y; tn = (sender as TreeView).GetNodeAt((sender as TreeView).PointToClient(pt)); if (tn == null) return; (sender as TreeView).SelectedNode = tn; if (tn.GetNodeCount(true) > 0) tn.Expand(); } private void objDragDrop(object sender, DragEventArgs e) { //这里处理拖放后的操作,比如更改选中数据属性 TreeNode tn = null; Point pt = new Point(); pt.X = e.X; pt.Y = e.Y; tn = (sender as TreeView).GetNodeAt((sender as TreeView).PointToClient(pt)); if (tn == null) return; if (tn.GetNodeCount(true) > 0) { MessageBox.Show("【" + tn.Text + "】不是最后一级不能拖拽"); return; } if (MessageBox.Show("确定将所选档案信息转移到[" + tn.Text + "]", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { return; } //选中行操作,修改或者删除 int[] rowid = currentGridView.GetSelectedRows(); foreach (int rid in rowid) { DataRow dr = currentGridView.GetDataRow(rid); SqlHelper.ExecuteNonQuery("update " + SQLDT1 + " set " + sdkModel["fieldname"] + "='" + tn.Name + "' where " + filedKey + "='" + dr[filedKey] + "'"); } dragComplete(sender, e); } } public class GridDrag2Grid { private GridHitInfo downHitInfo; GridView sourceView = null; GridView targetView = null; public callBack internal_func { get; set; } private bool dragIng = false; public delegate void callBack(object sender); public GridDrag2Grid(GridControl source, GridControl target, callBack callFunc) { internal_func = callFunc; sourceView = (source.FocusedView as GridView); targetView = (target.FocusedView as GridView); (source.FocusedView as GridView).OptionsSelection.MultiSelect = true; source.FocusedView.MouseDown += new MouseEventHandler(gridViewMouseDown); source.FocusedView.MouseMove += new MouseEventHandler(gridViewMouseMove); source.FocusedView.MouseUp += new MouseEventHandler(gridViewMouseUp); target.AllowDrop = true; target.DragEnter += new DragEventHandler(gridDragEnter); target.DragDrop += new DragEventHandler(gridDragDrop); } private void gridMouseDown(object sender, MouseEventArgs e) { downHitInfo = sourceView.CalcHitInfo(new Point(e.X, e.Y)); dragIng = true; } private void gridMouseMove(object sender, MouseEventArgs e) { if (downHitInfo == null) return; if (e.Button != MouseButtons.Left) return; Rectangle dragRect = new Rectangle(new Point( downHitInfo.HitPoint.X - SystemInformation.DragSize.Width / 2, downHitInfo.HitPoint.Y - SystemInformation.DragSize.Height / 2), SystemInformation.DragSize); if (!dragRect.Contains(new Point(e.X, e.Y))) { DataRow data = sourceView.GetDataRow(downHitInfo.RowHandle); int[] rows = sourceView.GetSelectedRows(); List row = new List(); for (int i = 0; i < rows.Length; i++) row.Add(sourceView.GetDataRow((int)rows[i])); (sender as GridControl).DoDragDrop(row, DragDropEffects.Move); } } private void gridViewMouseDown(object sender, MouseEventArgs e) { targetView.Tag = "1"; dragIng = true; GridView view = sender as GridView; downHitInfo = null; GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y)); if (Control.ModifierKeys != Keys.None) return; if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0) downHitInfo = hitInfo; } private void gridViewMouseUp(object sender, MouseEventArgs e) { dragIng = false; targetView.Tag = "0"; } private void gridViewMouseMove(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))) { object row = view.GetRow(downHitInfo.RowHandle); view.GridControl.DoDragDrop(row, DragDropEffects.Move); downHitInfo = null; DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true; } } } private void gridDragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; targetView.Tag = "1"; } private void gridDragDrop(object sender, DragEventArgs e) { if (internal_func != null) { if (dragIng == true) { internal_func(sender); dragIng = false; } return; } GridControl grid = sender as GridControl; DataTable table = grid.DataSource as DataTable; List row = e.Data.GetData(typeof(List)) as List; if (row != null && table != null) { if (row.Count > 0) { for (int i = 0; i < row.Count; i++) { table.ImportRow(row[i]); row[i].Delete(); // 把原有的数据行删除。 } } } dragIng = false; targetView.Tag = "0"; } } public class GridDrag2GridUpdate { private GridHitInfo downHitInfo; GridView sourceView = null; GridView targetView = null; public callBack internal_func { get; set; } private bool dragIng = false; public delegate void callBack(object sender); public GridDrag2GridUpdate(GridControl source, GridControl target, callBack callFunc) { internal_func = callFunc; sourceView = (source.FocusedView as GridView); targetView = (target.FocusedView as GridView); source.FocusedView.MouseDown += new MouseEventHandler(gridViewMouseDown); source.FocusedView.MouseMove += new MouseEventHandler(gridViewMouseMove); source.FocusedView.MouseUp += new MouseEventHandler(gridViewMouseUp); target.AllowDrop = true; target.DragOver += new DragEventHandler(target_DragOver); target.DragEnter += new DragEventHandler(gridDragEnter); target.DragDrop += new DragEventHandler(gridDragDrop); } private void gridMouseDown(object sender, MouseEventArgs e) { downHitInfo = sourceView.CalcHitInfo(new Point(e.X, e.Y)); dragIng = true; targetView.Tag = "1"; } private void gridMouseMove(object sender, MouseEventArgs e) { if (downHitInfo == null) return; if (e.Button != MouseButtons.Left) return; Rectangle dragRect = new Rectangle(new Point( downHitInfo.HitPoint.X - SystemInformation.DragSize.Width / 2, downHitInfo.HitPoint.Y - SystemInformation.DragSize.Height / 2), SystemInformation.DragSize); if (!dragRect.Contains(new Point(e.X, e.Y))) { DataRow data = sourceView.GetDataRow(downHitInfo.RowHandle); int[] rows = sourceView.GetSelectedRows(); List row = new List(); for (int i = 0; i < rows.Length; i++) row.Add(sourceView.GetDataRow((int)rows[i])); (sender as GridControl).DoDragDrop(row, DragDropEffects.Move); } } private void gridViewMouseDown(object sender, MouseEventArgs e) { targetView.Tag = "1"; dragIng = true; GridView view = sender as GridView; downHitInfo = null; GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y)); if (Control.ModifierKeys != Keys.None) return; if (e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0) downHitInfo = hitInfo; } private void gridViewMouseMove(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))) { object row = view.GetRow(downHitInfo.RowHandle); view.GridControl.DoDragDrop(row, DragDropEffects.Move); downHitInfo = null; DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true; } } } private void gridViewMouseUp(object sender, MouseEventArgs e) { dragIng = false; targetView.Tag = "0"; } private void target_DragOver(object sender, DragEventArgs e) { 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); downHitInfo = targetGrid.CalcHitInfo(pt); if (downHitInfo == null || downHitInfo.RowHandle < 0) return; targetGrid.SelectRow(downHitInfo.RowHandle); targetGrid.FocusedRowHandle = downHitInfo.RowHandle; } private void gridDragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; targetView.Tag = "1"; } private void gridDragDrop(object sender, DragEventArgs e) { if (internal_func != null) { if (dragIng == true) { internal_func(sender); dragIng = false; } targetView.Tag = "0"; return; } GridControl grid = sender as GridControl; DataTable table = grid.DataSource as DataTable; List row = e.Data.GetData(typeof(List)) as List; if (row != null && table != null) { if (row.Count > 0) { for (int i = 0; i < row.Count; i++) { table.ImportRow(row[i]); row[i].Delete(); // 把原有的数据行删除。 } } } targetView.Tag = "0"; } } }