Hi
I have a datagrid with multiselect enabled and I want allow the user to order rows by drag and drop.
I found code from anotehr question in the form: http://social.msdn.microsoft.com/Forums/windows/en-US/16b0a44e-35a0-4bc8-9ccd-ec2c62c95a55/select-and-drag-a-datagridview-row-with-a-single-click
but it's doesn't works for me - I success to drag but not to drop, it's show me "now allow" icon like i draw here:
Image may be NSFW.
Clik here to view.
the full drag and drop code is:
// Aid variables private Rectangle dragBoxFromMouseDown; private int rowIndexFromMouseDown; private int rowIndexOfItemUnderMouseToDrop; private void dg_MIX_MouseMove(object sender, MouseEventArgs e) { if ((e.Button & MouseButtons.Right) == MouseButtons.Right) { // If the mouse moves outside the rectangle, start the drag. if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y)) { // Proceed with the drag and drop, passing in the list item. DragDropEffects dropEffect = dg_MIX.DoDragDrop( dg_MIX.Rows[rowIndexFromMouseDown], DragDropEffects.Move); } } } private void dg_MIX_MouseDown(object sender, MouseEventArgs e) { // Get the index of the item the mouse is below. rowIndexFromMouseDown = dg_MIX.HitTest(e.X, e.Y).RowIndex; if (rowIndexFromMouseDown != -1) { // Remember the point where the mouse down occurred. // The DragSize indicates the size that the mouse can move // before a drag event should be started. Size dragSize = SystemInformation.DragSize; // Create a rectangle using the DragSize, with the mouse position being // at the center of the rectangle. dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize); } else // Reset the rectangle if the mouse is not over an item in the ListBox. dragBoxFromMouseDown = Rectangle.Empty; } private void dg_MIX_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; } private void dg_MIX_DragDrop(object sender, DragEventArgs e) { // The mouse locations are relative to the screen, so they must be // converted to client coordinates. Point clientPoint = dg_MIX.PointToClient(new Point(e.X, e.Y)); // Get the row index of the item the mouse is below. rowIndexOfItemUnderMouseToDrop = dg_MIX.HitTest(clientPoint.X, clientPoint.Y).RowIndex; // If the drag operation was a move then remove and insert the row. if (e.Effect == DragDropEffects.Move) { DataGridViewRow rowToMove = e.Data.GetData( typeof(DataGridViewRow)) as DataGridViewRow; dg_MIX.Rows.RemoveAt(rowIndexFromMouseDown); dg_MIX.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove); } }
Does someone know why I get this error icon and how can I improve the code to supported multi line select?
Thank you !