主要事件有MouseDown 、MouseMove、还有DragOver、DragDrop
//公共变量,存放要拖拽的对象GridHitInfo downHitInfo = null;//鼠标按下事件private void gridView1_MouseDown( 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 gridView1_MouseMove( 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;}}}//目标控件中也需要实现两个事件及一个属性,分别为DragOver,DragDrop两个事件和AllowDrop属性,代码如下://将对象拖过对象边界时触发private void gridControl1_DragOver( object sender, DragEventArgs e ) {e.Effect = DragDropEffects.Move;}//拖放完成后,相关数据的处理,如删除源控件中的ROW及目标控件中新增一行等,略private void gridControl1_DragDrop( object sender, DragEventArgs e ){GridControl grid = sender as GridControl;GridView view = grid.MainView as GridView;GridHitInfo hitInfo = view.CalcHitInfo(grid.PointToClient(new Point(e.X, e.Y)));int sourceRow = downHitInfo.RowHandle;int targetRow = hitInfo.RowHandle;MoveRow(sourceRow, targetRow,chooseFiles);}
GridContorl1需要设置AllowDrop=true
对于已经绑定好数据源的GridControl,拖拽部分只能通过改变原始DataTable的排列来
我自己写了一个更改顺序的方法
之前第三行写的if (sourceRow == targetRow || sourceRow == targetRow + 1) return;
这样导致了如果目标行是原始资源行的上一个,无法移动,如视频所示,把sourceRow=targetRow+1删掉就好了
private void MoveRow(int sourceRow, int targetRow,DataTable sourceTable){if (sourceRow == targetRow) return;GridView view = gridView8;GridControl gc = gridControl1;//sourceTable = UpdateChooseFileLine(sourceRow, targetRow, sourceTable);gridControl1.DataSource = sourceTable;gridView8.RefreshData();}private DataTable UpdateChooseFileLine(int sourceRow,int targetRow,DataTable sourceTable){DataTable dt = new DataTable();dt.Columns.Add("IsChoose", typeof(bool)).SetOrdinal(0);dt.Columns.Add("IsOverlayVisible", typeof(bool)).SetOrdinal(1);dt.Columns.Add("IsLine", typeof(bool)).SetOrdinal(2);dt.Columns.Add("IsLocked", typeof(bool)).SetOrdinal(3);dt.Columns.Add("Name");for(int j=0;j<sourceTable.Rows.Count;j++){DataRow dr;if(j==targetRow){dr = dt.NewRow();dr.ItemArray = sourceTable.Rows[sourceRow].ItemArray;Console.WriteLine(dr["Name"].ToString());dt.Rows.Add(dr);}if (j == sourceRow){continue;}dr = dt.NewRow();dr.ItemArray = sourceTable.Rows[j].ItemArray;dt.Rows.Add(dr);}return dt;}

