首先,添加引用:using DevExpress.XtraGrid.Views.Grid.ViewInfo;
gridControl1.AllowDrop = true; // 確保能夠拖拽
gridView1.OptionsSelection.MultiSelect = true; //確保能夠多選
gridView1.OptionsSelection.EnableAppearanceFocusedCell = false; //確保選定行的背景色一樣。
gridView1.OptionsBehavior.Editable = false;
gridView1.OptionsBehavior.ReadOnly = true;
上述初始化最好放在賦數據源之前。否則數據一開始顯示的時候沒有選中行。
//GridHitInfo根據鼠標點擊的x、y坐標獲取該點的相關信息
private GridHitInfo downHitInfo;
private GridHitInfo upHitInfo;
觸發事件:
//鼠標按下事件
private void gridView1_MouseDown(object sender, MouseEventArgs e)
{
downHitInfo = gridView1.CalcHitInfo(new Point(e.X,e.Y));
}
{
downHitInfo = gridView1.CalcHitInfo(new Point(e.X,e.Y));
}
//鼠標移動事件
private void gridView1_MouseMove(object sender, MouseEventArgs e) {
if (e.Button != MouseButtons.Left) return; //判斷是否是左鍵
if (downHitInfo == null||downHitInfo.RowHandle <0) return; //判斷按下的位置是否有值,是否是gridview 的Items.
int[] rows =gridView1.GetSelectedRows();
foreach (int r in rows) // 獲取gridview 數據源中對應的信息。
{
if (e.Button != MouseButtons.Left) return; //判斷是否是左鍵
if (downHitInfo == null||downHitInfo.RowHandle <0) return; //判斷按下的位置是否有值,是否是gridview 的Items.
int[] rows =gridView1.GetSelectedRows();
List<XESHI > row = new List<XESHI >();
foreach (int r in rows) // 獲取gridview 數據源中對應的信息。
{
//根據 gridview 中的行索引獲取數據源中對應的是行索引
int dataSourcerows = gridView1.GetDataSourceRowIndex(r);
row.Add(asd[dataSourcerows]);
}
gridControl1.DoDragDrop(row, DragDropEffects.Move);//開始拖放操作。
}
int dataSourcerows = gridView1.GetDataSourceRowIndex(r);
row.Add(asd[dataSourcerows]);
}
gridControl1.DoDragDrop(row, DragDropEffects.Move);//開始拖放操作。
}
private void gridControl1_DragDrop(object sender, DragEventArgs e)
{
//獲取鼠標在屏幕上的位置。
Point gridviewPoint = this.PointToScreen (this.gridControl1.Location );
//獲取 gridview 中對應的的位置(屏幕位置減去 gridView 開始位置)
Point gridviewPoint = this.PointToScreen (this.gridControl1.Location );
//獲取 gridview 中對應的的位置(屏幕位置減去 gridView 開始位置)
upHitInfo = gridView1.CalcHitInfo(new Point(e.X - gridviewPoint.X, e.Y - gridviewPoint.Y));
if (upHitInfo == null || upHitInfo.RowHandle < 0) return;
//獲取釋放的位置列索引
int endRow =gridView1.GetDataSourceRowIndex ( gridView1.GetDataSourceRowIndex(upHitInfo.RowHandle));
int endRow =gridView1.GetDataSourceRowIndex ( gridView1.GetDataSourceRowIndex(upHitInfo.RowHandle));
List<XESHI> row = e.Data.GetData(typeof(List<XESHI>)) as List<XESHI>; //獲取要移動的數據
if (row != null && row.Count > 0) //沒有移動的數據跳過
{
int a;
//獲取移動列集合的第一列在數據源的索引
int startRow = asd.IndexOf(row[0]);
XESHI xs = asd[endRow];
if (!row.Contains(xs)) //如果多選的話,確保不能拖拽到這幾個里
{
gridView1.ClearSelection();
//排序,先刪除后后添加,
for (int i = 0; i < row.Count; i++)
asd.Remove(row[i]);
//若果往上托,則加在鼠標到達行的上面
//如果往下拖,則加在鼠標到達行的下面
if (startRow > endRow)
a = asd.IndexOf(xs);
else
a = asd.IndexOf(xs) + 1;
for (int i = 0; i < row.Count; i++)
{
asd.Insert(a + i, row[i]);
gridView1.SelectRow(a + i);
}
gridView1.FocusedRowHandle = a;
}
}
gridControl1.DataSource = asd;
gridView1.RefreshData();
}
if (startRow > endRow)
a = asd.IndexOf(xs);
else
a = asd.IndexOf(xs) + 1;
for (int i = 0; i < row.Count; i++)
{
asd.Insert(a + i, row[i]);
gridView1.SelectRow(a + i);
}
gridView1.FocusedRowHandle = a;
}
}
gridControl1.DataSource = asd;
gridView1.RefreshData();
}
private void gridControl1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
{
e.Effect = DragDropEffects.Move;
}
程序中用到的一些類:
public class XESHI
{
public string Name { get; set; }
public string Xinshui { get; set; }
}
List<XESHI> asd = new List<XESHI>();

