C# 바인딩된 Datagridview 마우스 드래그로 순서 변경하기


        private Rectangle dragBoxFromMouseDown;
        private int rowIndexFromMouseDown;
        private int rowIndexOfItemUnderMouseToDrop;

        private void ItemGrid_MouseMove(object sender, MouseEventArgs e)
        {
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                if (dragBoxFromMouseDown != Rectangle.Empty &&
                    !dragBoxFromMouseDown.Contains(e.X, e.Y))
                {
                    DragDropEffects dropEffect = ItemGrid.DoDragDrop(ItemGrid.Rows[rowIndexFromMouseDown], DragDropEffects.Move);
                }
            }
        }

        private void ItemGrid_MouseDown(object sender, MouseEventArgs e)
        {
            rowIndexFromMouseDown = ItemGrid.HitTest(e.X, e.Y).RowIndex;
            if (rowIndexFromMouseDown != -1)
            {
                Size dragSize = SystemInformation.DragSize;

                dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
            }
            else
                dragBoxFromMouseDown = Rectangle.Empty;
        }

        private void ItemGrid_DragDrop(object sender, DragEventArgs e)
        {
            Point clientPoint = ItemGrid.PointToClient(new Point(e.X, e.Y));

            rowIndexOfItemUnderMouseToDrop = ItemGrid.HitTest(clientPoint.X, clientPoint.Y).RowIndex;

            if (e.Effect == DragDropEffects.Move)
            {
                Item item = ItemList[rowIndexFromMouseDown];
                ItemList.RemoveAt(rowIndexFromMouseDown);
                ItemList.Insert(rowIndexOfItemUnderMouseToDrop, item);
            }

            ItemGrid.Rows[rowIndexOfItemUnderMouseToDrop].Selected = true; // 드래그해서 놓은 위치에 선택
        }

        private void ItemGrid_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }