title: Drag and Drop item from DataGridView to a panel
body: <p>I have searched for a solution for drag and drop in <code>DataGridView</code> but all I found was about reordering the items.</p>
  
  <p>But what I have is a <code>DataGridView</code> bound to a SQL server database using LINQ to Entities and reordering is not applicable, all I want was to drag an item from the <code>DataGridView</code> and drop it on a panel in the same form. How can I do that ?</p>
  
  <p>The code that I found that allows reordering:</p>
  
  <pre><code>    private Rectangle dragBoxFromMouseDown;
      private int rowIndexFromMouseDown;
      private int rowIndexOfItemUnderMouseToDrop;
  
      private void dgvResult_MouseMove(object sender, MouseEventArgs e)
      {
          if ((e.Button &amp; MouseButtons.Left) == MouseButtons.Left)
          {
              // If the mouse moves outside the rectangle, start the drag.
              if (dragBoxFromMouseDown != Rectangle.Empty &amp;&amp;
                  !dragBoxFromMouseDown.Contains(e.X, e.Y))
              {
  
                  // Proceed with the drag and drop, passing in the list item.                    
                  DragDropEffects dropEffect = dgvResult.DoDragDrop(
                  dgvResult.Rows[rowIndexFromMouseDown],
                  DragDropEffects.Move);
              }
          }
      }
  
      private void dgvResult_MouseDown(object sender, MouseEventArgs e)
      {
          // Get the index of the item the mouse is below.
          rowIndexFromMouseDown = dgvResult.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 dgvResult_DragOver(object sender, DragEventArgs e)
      {
          e.Effect = DragDropEffects.Move;
      }
  
      private void dgvResult_DragDrop(object sender, DragEventArgs e)
      {
          // The mouse locations are relative to the screen, so they must be 
          // converted to client coordinates.
          Point clientPoint = dgvResult.PointToClient(new Point(e.X, e.Y));
  
          // Get the row index of the item the mouse is below. 
          rowIndexOfItemUnderMouseToDrop =
              dgvResult.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;
              dgvResult.Rows.RemoveAt(rowIndexFromMouseDown);
              dgvResult.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove);
  
          }
      }
  </code></pre>
  
  <p>And any attempt for drag and drop inside the <code>DataGridView</code> throws an exception:</p>
  
  <blockquote>
    <p>Rows cannot be programmatically removed unless the DataGridView is data-bound to an IBindingList that supports change notification and allows deletion.</p>
  </blockquote>