У меня есть окна с 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);
}
}
}
У меня есть пример кода MSDN для перемещения строк вверх и вниз с помощью кнопок, которые вы не ищете, но может использоваться базовая логика, которая используется в нескольких методах расширения языка для vb.net и C#. Не нужно скачивать, просто просматривайте код. Я не включил здесь код, поскольку он использует кнопки, а не перетаскивание. https://code.msdn.microsoft.com/Move-rows-updown-and-987fe786 –