dataGridView 如何实现行行的拖动,即行之间相互交换位置

private void dataGridView_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e)
        {
            if ((e.Clicks < 2) && (e.Button==MouseButtons.Left))
            {
                if ((e.ColumnIndex ==-1) && (e.RowIndex > -1))
                    dataGridView.DoDragDrop(dataGridView.Rows[e.RowIndex], DragDropEffects.Move);
            }
        }
鼠标在单元格里移动时激活拖放功能,我这里判断了如果是只有单击才执行拖放,双击我要执行其他功能,而且只有点在每行的表头那一格拖动才行,否则会影响编辑其他单元格的值。如果希望点在任何一个单元格都可以拖动,去掉判断列序号的条件就行了。

        private void dataGridView_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));
dataGridView.Rows.Remove(row);
dataGridView.Rows.Insert(idx,row);
selectionIdx=idx;
            }
        }
拖动到目的地后的操作,GetRowFromPoint是根据鼠标按键被释放时的鼠标位置计算行序号。

        private int GetRowFromPoint(int x, int y)
        {
            for (int i = 0; i < dataGridView.RowCount; i++)
            {
                Rectangle rec = dataGridView.GetRowDisplayRectangle(i, false);

                if (dataGridView.RectangleToScreen(rec).Contains(x, y))
                    return i;
            }

            return -1;
        }

到这里基本功能其实已经完成。只是有些细节需要调整。一般我们希望拖动完成后被选中的行是刚才拖动的那一行,但是DataGridView会自动选中顶替我们拖动的那一行位置的新行,也就是说,比如我们拖动第3行到其他位置,结束后,被选中的行仍然是新的第3行。在DragDrop方法里设置也没有用,DataGridView选中新行的行为是在DragDrop结束后。所以我们必须自己记录选中行的行号。在类中添加一个字段selectionIdx。

        private void dataGridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
        {
            if (e.RowIndex>=0)
                selectionIdx = e.RowIndex;
}
注意DragDrop方法最后,selectionIdx被赋值为拖动行的新行号。

        private void dataGridView_SelectionChanged(object sender, EventArgs e)
        {
            if ((dataGridView.Rows.Count > 0) && (dataGridView.SelectedRows.Count>0) && (dataGridView.SelectedRows[0].Index != selectionIdx))
            {
                if (dataGridView.Rows.Count <= selectionIdx)
                    selectionIdx = dataGridView.Rows.Count - 1;
                dataGridView.Rows[selectionIdx].Selected = true;
                dataGridView.CurrentCell = dataGridView.Rows[selectionIdx].Cells[0];
            }
        }

在这里判断,如果selectionIdx的值和当前选中的行号不同,则选中行号为selectionIdx的这一行。

        private void dataGridView_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }
这个方法设置在DataGridView里拖动时,鼠标不会显示禁止拖放的光标。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
实现DataGridView拖动需要以下步骤: 1. 开启DataGridView的AllowUserToAddRows和AllowUserToDeleteRows属性,允许用户添加和删除。 2. 设置DataGridView的SelectionMode属性为FullRowSelect,表示整被选中。 3. 添加MouseDown、MouseMove和MouseUp事件处理程序。 4. 在MouseDown事件中,获取当前鼠标所在的,并将其保存为被拖动。 5. 在MouseMove事件中,判断鼠标是否按下并移动,如果是,则将被拖动拖动到鼠标所在的位置。 6. 在MouseUp事件中,完成的交换。 示例代码如下: ``` private DataGridViewRow dragRow = null; // 被拖动 private void dataGridView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int rowIndex = dataGridView1.HitTest(e.X, e.Y).RowIndex; if (rowIndex >= 0) { dragRow = dataGridView1.Rows[rowIndex]; dataGridView1.DoDragDrop(dragRow, DragDropEffects.Move); } } } private void dataGridView1_DragOver(object sender, DragEventArgs e) { e.Effect = DragDropEffects.Move; } private void dataGridView1_DragDrop(object sender, DragEventArgs e) { int targetIndex = dataGridView1.HitTest(dataGridView1.PointToClient(new Point(e.X, e.Y))).RowIndex; if (targetIndex >= 0 && targetIndex != dragRow.Index) { dataGridView1.Rows.Remove(dragRow); dataGridView1.Rows.Insert(targetIndex, dragRow); } } private void dataGridView1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && dragRow != null) { dataGridView1.DoDragDrop(dragRow, DragDropEffects.Move); } } private void dataGridView1_MouseUp(object sender, MouseEventArgs e) { dragRow = null; } ``` 以上代码实现拖动DataGridView的功能,用户可以通过鼠标拖动的顺序进交换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值