DataGridView编辑好行内容后,有时需要交换行的位置,这个动作实现效果如下:
![](https://img.haomeiwen.com/i11144486/5c1ac7d55453e8cb.gif)
实现方法如下:
int dragRow = -1;
Label dragLabel = null;
/// <summary>
/// 鼠标按下的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgvStep_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0) return;
dragRow = e.RowIndex;
DataGridView dgv = (DataGridView)sender;
if (e.Button == MouseButtons.Left && !dgv.IsCurrentCellInEditMode)
{
if (dragLabel == null) dragLabel = new Label();
dragLabel.Text = dgv.Rows[e.RowIndex].Cells[1].Value.ToString();
dragLabel.Parent = dgv;
dragLabel.Location = e.Location;
}
}
/// <summary>
/// 鼠标箭头移动事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgvStep_MouseMove(object sender, MouseEventArgs e)
{
DataGridView dgv = (DataGridView)sender;
if (e.Button == MouseButtons.Left && dragLabel != null)
{
var hit = dgv.HitTest(e.X, e.Y);
if (hit.RowIndex >= 0)
{
dragLabel.Location = e.Location;
dgv.CurrentCell = dgv.Rows[hit.RowIndex].Cells[0];
dgv.ClearSelection();
}
}
}
/// <summary>
/// 鼠标释放的操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgvStep_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && dragLabel != null)
{
dragLabel.Dispose();
dragLabel = null;
}
DataGridView dgv = (DataGridView)sender;
var hit = dgv.HitTest(e.X, e.Y);
int dropRow = -1;
if (hit.Type != DataGridViewHitTestType.None)
{
dropRow = hit.RowIndex;
if (dragRow >= 0)
{
int tgtRow = dropRow;
if (tgtRow != dragRow)
{
//dgv移动
DataGridViewRow row = dgv.Rows[dragRow];
dgv.Rows.Remove(row);
dgv.Rows.Insert(tgtRow, row);
dgv.CurrentCell = dgvStep.Rows[tgtRow].Cells[1];//移动箭头
dgv.ClearSelection();
row.Selected = true;
}
else
{
dgv.Rows[dragRow].Selected = true;
dgv.CurrentCell = dgvStep.Rows[dragRow].Cells[1];//移动箭头
}
}
}
else
{
if (dragRow >= 0)
{
dgv.Rows[dragRow].Selected = true;
dgv.CurrentCell = dgvStep.Rows[dragRow].Cells[1];//移动箭头
}
}
}
参考c# - Datagridview Winform C# 拖放行
对其优化了下。
网友评论