主要事件有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;
}