主要事件有MouseDown 、MouseMove、还有DragOver、DragDrop

    1. //公共变量,存放要拖拽的对象
    2. GridHitInfo downHitInfo = null;
    3. //鼠标按下事件
    4. private void gridView1_MouseDown( object sender, MouseEventArgs e ) {
    5. GridView view = sender as GridView;
    6. downHitInfo = null;
    7. GridHitInfo hitInfo = view.CalcHitInfo( new Point( e.X, e.Y ) );
    8. if( Control.ModifierKeys != Keys.None ) return;
    9. if( e.Button == MouseButtons.Left && hitInfo.RowHandle >= 0 )
    10. downHitInfo = hitInfo;
    11. }
    12. //鼠标移动事件
    13. private void gridView1_MouseMove( object sender, MouseEventArgs e ) {
    14. GridView view = sender as GridView;
    15. if( e.Button == MouseButtons.Left && downHitInfo != null ) {
    16. Size dragSize = SystemInformation.DragSize;
    17. Rectangle dragRect = new Rectangle( new Point( downHitInfo.HitPoint.X - dragSize.Width / 2,
    18. downHitInfo.HitPoint.Y - dragSize.Height / 2 ), dragSize );
    19. if( !dragRect.Contains( new Point( e.X, e.Y ) ) ) {
    20. object row = view.GetRow( downHitInfo.RowHandle );
    21. view.GridControl.DoDragDrop( row, DragDropEffects.Move );
    22. downHitInfo = null;
    23. DevExpress.Utils.DXMouseEventArgs.GetMouseArgs( e ).Handled = true;
    24. }
    25. }
    26. }
    27. //目标控件中也需要实现两个事件及一个属性,分别为DragOver,DragDrop两个事件和AllowDrop属性,代码如下:
    28. //将对象拖过对象边界时触发
    29. private void gridControl1_DragOver( object sender, DragEventArgs e ) {
    30. e.Effect = DragDropEffects.Move;
    31. }
    32. //拖放完成后,相关数据的处理,如删除源控件中的ROW及目标控件中新增一行等,略
    33. private void gridControl1_DragDrop( object sender, DragEventArgs e )
    34. {
    35. GridControl grid = sender as GridControl;
    36. GridView view = grid.MainView as GridView;
    37. GridHitInfo hitInfo = view.CalcHitInfo(grid.PointToClient(new Point(e.X, e.Y)));
    38. int sourceRow = downHitInfo.RowHandle;
    39. int targetRow = hitInfo.RowHandle;
    40. MoveRow(sourceRow, targetRow,chooseFiles);
    41. }

    GridContorl1需要设置AllowDrop=true

    对于已经绑定好数据源的GridControl,拖拽部分只能通过改变原始DataTable的排列来

    我自己写了一个更改顺序的方法
    之前第三行写的if (sourceRow == targetRow || sourceRow == targetRow + 1) return;
    这样导致了如果目标行是原始资源行的上一个,无法移动,如视频所示,把sourceRow=targetRow+1删掉就好了

    1. private void MoveRow(int sourceRow, int targetRow,DataTable sourceTable)
    2. {
    3. if (sourceRow == targetRow) return;
    4. GridView view = gridView8;
    5. GridControl gc = gridControl1;
    6. //
    7. sourceTable = UpdateChooseFileLine(sourceRow, targetRow, sourceTable);
    8. gridControl1.DataSource = sourceTable;
    9. gridView8.RefreshData();
    10. }
    11. private DataTable UpdateChooseFileLine(int sourceRow,int targetRow,DataTable sourceTable)
    12. {
    13. DataTable dt = new DataTable();
    14. dt.Columns.Add("IsChoose", typeof(bool)).SetOrdinal(0);
    15. dt.Columns.Add("IsOverlayVisible", typeof(bool)).SetOrdinal(1);
    16. dt.Columns.Add("IsLine", typeof(bool)).SetOrdinal(2);
    17. dt.Columns.Add("IsLocked", typeof(bool)).SetOrdinal(3);
    18. dt.Columns.Add("Name");
    19. for(int j=0;j<sourceTable.Rows.Count;j++)
    20. {
    21. DataRow dr;
    22. if(j==targetRow)
    23. {
    24. dr = dt.NewRow();
    25. dr.ItemArray = sourceTable.Rows[sourceRow].ItemArray;
    26. Console.WriteLine(dr["Name"].ToString());
    27. dt.Rows.Add(dr);
    28. }
    29. if (j == sourceRow)
    30. {
    31. continue;
    32. }
    33. dr = dt.NewRow();
    34. dr.ItemArray = sourceTable.Rows[j].ItemArray;
    35. dt.Rows.Add(dr);
    36. }
    37. return dt;
    38. }

    效果:拖拽顺序时,放置与目标位置的上一行 20200705_160436.mp4 (2.03MB)