2016-01-16 38 views
1

我使用DataGridView創建窗體,我需要在此DataGridView中拖放行。在DataGridView中拖放行

它從數據庫中填充。我的代碼無法正常工作,因爲在第一次拖放之後,我無法將行拖放到正確的位置。

這是Load形式,其中DataGridView從數據庫

DataTable bsPeople; 
Rectangle dragBoxFromMouseDown; 
    int rowIndexFromMouseDown; 
    int rowIndexOfItemUnderMouseToDrop; 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     DataGridView1.AllowDrop = true; 
     bsPeople= objPeople.ReturnPeople(); // fill data from SQL Server 
     DataGridView1.DataSource = bsPeople; 
    } 

填補這是拖放事件

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

    private void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     rowIndexFromMouseDown = DataGridView1.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 dataGridView1_DragOver(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Move; 
    } 

    private void dataGridView1_DragDrop(object sender, DragEventArgs e) 
    { 
     Point clientPoint = DataGridView1.PointToClient(new Point(e.X, e.Y)); 
     rowIndexOfItemUnderMouseToDrop = DataGridView1.HitTest(clientPoint.X, clientPoint.Y).RowIndex; 
     if ((e.Effect == DragDropEffects.Move)) 
     { 
      DataGridViewRow rowToMove = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow)); 
      object[] celldata=new object[DataGridView1.ColumnCount]; 
      for (int col = 0; (col 
         <= (rowToMove.Cells.Count - 1)); col++) 
      { 
       celldata[col] = rowToMove.Cells[col].Value; 
      } 

      DataRow row = bsPeople.NewRow(); 
      row.ItemArray = celldata; 
      bsPeople.Rows.InsertAt(row, rowIndexOfItemUnderMouseToDrop); 
      rowToMove.DataGridView.Rows.Remove(rowToMove); 

     } 
    } 
} 
+0

我有一個MSDN代碼示例移動行了並通過按鈕,而不是你在找什麼,但基本邏輯可以使用幾種語言擴展方法爲vb.net和C#。無需下載,只需瀏覽代碼即可。我沒有在這裏包含代碼,因爲它使用按鈕而不是拖放。 https://code.msdn.microsoft.com/Move-rows-updown-and-987fe786 –

回答

1

將&降

您需要刪除和插入右邊DataRows。試試這個:

private void DGV_DragDropData(object sender, DragEventArgs e) 
{ 
    Point clientPoint = DGV.PointToClient(new Point(e.X, e.Y)); 
    rowIndexOfItemUnderMouseToDrop = 
     DGV.HitTest(clientPoint.X, clientPoint.Y).RowIndex; 
    if (e.Effect == DragDropEffects.Move) 
    { 
     DataGridViewRow rowToMove = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow)); 
     // find the row to move in the datasource: 
     DataRow oldrow = ((DataRowView)rowToMove.DataBoundItem).Row; 
     // clone it: 
     DataRow newrow = bsPeople.NewRow(); 
     newrow.ItemArray = oldrow.ItemArray; 
     bsPeople.Rows.InsertAt(newrow, rowIndexOfItemUnderMouseToDrop); 
     bsPeople.Rows.Remove(oldrow); 
    } 
} 

注意,代碼只移動一個一行。對於移動多行有需要一些更多的招數..

國行:

另外請注意,您可能需要設置新行的RowState,根據您的需要。添加它時,您可能需要通過調用newRow.AcceptChanges()或其他狀態來將其設置爲Unchanged,具體取決於原始行的狀態。

要修改RowState幾個規則:

  • DataRow必須駐留在DataTable;在你創建它之後,狀態是Unattached,你不能改變它。
  • 只有Unchanged行可以通過SetAddedSetModified方法更改;所以你必須先致電AcceptChanges()

這應該做的工作:

if (oldrow.RowState != DataRowState.Unchanged) newrow.AcceptChanges(); 
    if (oldrow.RowState == DataRowState.Added) newrow.SetAdded(); 
    if (oldrow.RowState == DataRowState.Modified) newrow.SetModified(); 

這些線必須新行被添加到表後加入..