实现DataGridView行的拖动,即实现行的顺序交换
1.界面准备
(1)首先在form中添加一个DataGridView控件,将默认AllowDrop=false 的属性设置为True,否侧不能拖动!
(2)对DataGridView的对象实现非数据源的绑定,因为设置DataSource属性即当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。
2.代码准备
(1)控制移动时鼠标的图形,否则是一个禁止移动的标识
private void dataGridView1_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
(2)控制拖动的条件,也可以自行放宽条件
private void dataGridView1 _CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
{
if ((e.Clicks < 2) && (e.Button == MouseButtons.Left))
{
if ((e.ColumnIndex == -1) && (e.RowIndex > -1))
dataGridView1.DoDragDrop(dataGridView1.Rows[e.RowIndex], DragDropEffects.Move);
}
}
(3)拖动后实现行的删除和添加,实现行交换位置的错觉
int selectionIdx = 0;
private void dataGridView1_DragDrop(object sender, DragEventArgs e)
{
int idx = GetRowFromPoint(e.X, e.Y);
if (idx < 0) return;
if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
{
DataGridViewRow row = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
dataGridView1.Rows.Remove(row);
selectionIdx = idx;
dataGridView1.Rows.Insert(idx, row);
}
}
private int GetRowFromPoint(int x, int y)
{
for (int i = 0; i < dataGridView1.RowCount; i++)
{
Rectangle rec = dataGridView1.GetRowDisplayRectangle(i, false);
if (dataGridView1.RectangleToScreen(rec).Contains(x, y))
return i;
}
return -1;
}
(4)控制被移动的行始终是选中行
private void kryptonDataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
if (selectionIdx > -1)
{
dataGridView1.Rows[selectionIdx].Selected = true;
dataGridView1.CurrentCell = dataGridView1.Rows[selectionIdx].Cells[0];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)