注意,分组不可用:下图为例的,分组不可用
引用:
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
声明:
DataTable _DT = new DataTable();
在 Load 事件里面添加:
this.gridControl1.AllowDrop = true; // 确保能够拖拽
this.gridView1.OptionsSelection.MultiSelect = true; //确保能够多选
this.gridView1.OptionsSelection.EnableAppearanceFocusedCell = false; //确保选定行的背景色一样
this.gridView1.OptionsSelection.EnableAppearanceFocusedCell = false; //确保选定行的背景色一样。
this.gridView1.OptionsBehavior.Editable = false;
this.gridControl1.DragDrop += gridControl1_DragDrop;
this.gridControl1.DragOver += gridControl1_DragOver;
this.gridView1.MouseMove += gridView1_MouseMove;
this.gridView1.MouseDown += gridView1_MouseDown;
_v织布日报BindingSource.DataSource = _DT;
内容:
#region
GridHitInfo downHitInfo = null;
private void gridView1_MouseDown(object sender, MouseEventArgs e)
{
downHitInfo = null;
GridHitInfo hitInfo = gridView1.CalcHitInfo(new Point(e.X, e.Y));
//鼠标左键单击,在行内,且不为新行
if (e.Button == MouseButtons.Left && hitInfo.InRow &&
hitInfo.RowHandle != GridControl.NewItemRowHandle)
downHitInfo = hitInfo;
}
private void gridView1_MouseMove(object sender, MouseEventArgs e)
{
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)))
{
gridControl1.DoDragDrop(downHitInfo, DragDropEffects.Move);
downHitInfo = null;
}
}
}
private void gridControl1_DragOver(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(GridHitInfo)))
{
GridHitInfo downHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo;
if (downHitInfo == null) return;
GridHitInfo hitInfo = gridView1.CalcHitInfo(gridControl1.PointToClient(new Point(e.X, e.Y)));
if (hitInfo.InRow && hitInfo.RowHandle != downHitInfo.RowHandle &&
hitInfo.RowHandle != GridControl.NewItemRowHandle)
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
}
private void gridControl1_DragDrop(object sender, DragEventArgs e)
{
GridHitInfo srcHitInfo = e.Data.GetData(typeof(GridHitInfo)) as GridHitInfo;
GridHitInfo hitInfo = gridView1.CalcHitInfo(gridControl1.PointToClient(new Point(e.X, e.Y)));
int sourceRowIndex = srcHitInfo.RowHandle;
int targetRowIndex = hitInfo.RowHandle;
if (sourceRowIndex == targetRowIndex) return;
ChangeRow(sourceRowIndex, targetRowIndex);
}
/// <summary>
/// 删除源行,并在目标位置插入源行
/// </summary>
/// <param name="sourceRowIndex"></param>
/// <param name="targetRowIndex"></param>
private void ChangeRow(int sourceRowIndex, int targetRowIndex)
{
DataRow sourceRow = gridView1.GetDataRow(sourceRowIndex);
DataRow targetRow = gridView1.GetDataRow(targetRowIndex);
//复制源行,再重新添加(直接复制的话,删除源行后复制行也会为空)
object[] objArray = sourceRow.ItemArray;
DataRow dragRowCopy = _DT.NewRow();
dragRowCopy.ItemArray = objArray;
sourceRow.Delete();
_DT.Rows.InsertAt(dragRowCopy, targetRowIndex);
//调整焦点到目标行上
gridView1.FocusedRowHandle = targetRowIndex;
}
#endregion