参考:http://blog.csdn.net/soarheaven/article/details/3267379
private void dataGridView1_DragEnter(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; }
(2)控制拖动的条件,也可以自行放宽条件
private void dataGridView1 _CellMouseMove(object sender, DataGridViewCellMouseEventArgs e) { if ((e.Clicks < 2) && (e.Button == MouseButtons.Left)) { if ((e.ColumnIndex == -1) && (e.RowIndex > -1)) dataGridView1.DoDragDrop(dataGridView1.Rows[e.RowIndex], DragDropEffects.Move); } }
(3)拖动后实现行的删除和添加,实现行交换位置的错觉
int selectionIdx = 0; private void dataGridView1_DragDrop(object sender, DragEventArgs e) { int idx = GetRowFromPoint(e.X, e.Y); if (idx < 0) return; if (e.Data.GetDataPresent(typeof(DataGridViewRow))) { DataGridViewRow row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow)); dataGridView1.Rows.Remove(row); selectionIdx = idx; dataGridView1.Rows.Insert(idx, row); } } private int GetRowFromPoint(int x, int y) { for (int i = 0; i < dataGridView1.RowCount; i++) { Rectangle rec = dataGridView1.GetRowDisplayRectangle(i, false); if (dataGridView1.RectangleToScreen(rec).Contains(x, y)) return i; } return -1; }
(4)控制被移动的行始终是选中行
private void kryptonDataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { if (selectionIdx > -1) { dataGridView1.Rows[selectionIdx].Selected = true; dataGridView1.CurrentCell = dataGridView1.Rows[selectionIdx].Cells[0]; } }
原文:http://www.cnblogs.com/swtool/p/5246518.html