I am trying to write some code so that users of my application can drag and drop rows into a DataGridView to reorder them. The problem is that the row that is being dragged disappears when it is discarded, so dragging and dropping results in a simple deletion of that row. Here is my code:
private Rectangle dragBoxFromMouseDown; private int rowIndexFromMouseDown; private int rowIndexOfItemUnderMouseToDrop; private void grdCons_MouseMove(object sender, MouseEventArgs e) { if ((e.Button & MouseButtons.Left) == MouseButtons.Left) { if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(eX, eY)) { DragDropEffects dropEffect = grdCons.DoDragDrop(grdCons.Rows[rowIndexFromMouseDown], DragDropEffects.Move); } } } private void grdCons_MouseDown(object sender, MouseEventArgs e) { rowIndexFromMouseDown = grdCons.HitTest(eX, eY).RowIndex; if (rowIndexFromMouseDown != -1) { Size dragSize = SystemInformation.DragSize; dragBoxFromMouseDown = new Rectangle(new Point(eX - (dragSize.Width / 2), eY - (dragSize.Height / 2)), dragSize); } else { dragBoxFromMouseDown = Rectangle.Empty; } } private void grdCons_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; } private void grdCons_DragDrop(object sender, DragEventArgs e) { Point clientPoint = grdCons.PointToClient(new Point(eX, eY)); rowIndexOfItemUnderMouseToDrop = grdCons.HitTest(clientPoint.X, clientPoint.Y).RowIndex; if (e.Effect == DragDropEffects.Move) { DataGridViewRow rowToMove = e.Data.GetData(typeof(DataGridViewRow)) as DataGridViewRow; grdCons.Rows.RemoveAt(rowIndexFromMouseDown); grdCons.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove); } }
Guess the Insert on DGV in the DragDrop event is not working.
Chris source share