2016-01-16 1 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

Drag & Капля

Вам нужно удалить и вставьте справа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); 
    } 
} 

Обратите внимание, что код перемещает только один строку. Для перемещения нескольких строк есть еще несколько трюков нужно ..

Состояние Row:

отметить также, что вам может понадобиться установить RowState новой строки, в зависимости от ваших потребностей. Поскольку он добавлен, вы можете установить его Unchanged, позвонив newRow.AcceptChanges() или, возможно, в другое состояние, в зависимости от состояния исходной строки.

Чтобы изменить RowState несколько правила:

  • DataRowсусло проживают в DataTable; после того, как вы только что создали его, состояние Unattached, и вы не можете его изменить.
  • Только Unchanged строки могут быть изменены SetAdded или SetModified методами; поэтому сначала необходимо позвонить AcceptChanges().

Это должно сделать работу:

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

Эти линии должны быть добавлены после новая строка добавляется в таблицу ..