C# 一个DataGridView 行们的拖拽

时间:2021-05-20 14:47:31

昨天摸索了下午,看了网上的很多实例代码,发现真心不能用,哪是什么拖拽,明明就是直接的删除嘛,基本的代码写的都一样,所以自己写啦,试着摸索


今天上午终于做出来了,这些天,杂事太多,导致我都没好好弄。嘿嘿,昨天网站抽奖中了个磁疗腰带准备送爸妈的,结果  鸭子飞了。

嘿嘿,说正事吧,我看了很多别人写的行的拖拽的方法,在我这里都试着不行,具体也不清楚是为什么,后来解决了msdn打不开的问题,就在msdn上找资料了,嘿嘿,找到了,并且修改过,现在已经确定能用了,嘿嘿C# 一个DataGridView 行们的拖拽,顿时happy起来了。

  //本身窗行的口的拖动,  先做这个
        private Rectangle dragBoxFromMouseDown;
        private int rowIndexFromMouseDown;
        private int rowIndexOfItemUnderMouseToDrop;
        private void dgvAllReg_MouseMove(object sender, MouseEventArgs e)
        {
            if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
            {
                //如果鼠标移动到矩形框外面,开始拖拽
                if (dragBoxFromMouseDown != Rectangle.Empty && !dragBoxFromMouseDown.Contains(e.X, e.Y))                
                {
                    //执行tt拖拽,传入数据
                    DragDropEffects dropEffect = dgvAllReg.DoDragDrop(dgvAllReg.Rows[rowIndexFromMouseDown], DragDropEffects.Move);
                }
            }
        }

       private void dgvAllReg_MouseDown(object sender, MouseEventArgs e)
        {
            //获取鼠标按下时行的索引值
            rowIndexFromMouseDown = dgvAllReg.HitTest(e.X, e.Y).RowIndex;

            if (rowIndexFromMouseDown != -1)
            {
                //记录按下鼠标的点
                //DragSize指示在开始拖动操作前鼠标可以移动的范围
                Size dragSize = SystemInformation.DragSize;

                //用DragSize创建一个以鼠标为中心的矩形
                dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
            }
            else
            {
                //如果鼠标不在datagridview上,重置矩形
                dragBoxFromMouseDown = Rectangle.Empty;
            }
        }

       private void dgvAllReg_DragOver(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Move;
        }

        private void dgvAllReg_DragDrop(object sender, DragEventArgs e)
        {
            //由于鼠标的位置是与屏幕相关的,它必须转换为与客户端相匹配的点
            Point clientPoint = dgvAllReg.PointToClient(new Point(e.X, e.Y));

            //获取鼠标按下时的行的索引值
            rowIndexOfItemUnderMouseToDrop = dgvAllReg.HitTest(clientPoint.X, clientPoint.Y).RowIndex;

            //如果拖放的行为为从将某一行移动然后移除,插入到某一行
            if (e.Effect == DragDropEffects.Move)
            {
                DataGridViewRow rowToMove = e.Data.GetData(typeof(DataGridViewRow)) as DataGridViewRow;
                DataRow dr = ((rowToMove).DataBoundItem as DataRowView).Row;
                DataRow drr = dtBand.NewRow();
                drr.ItemArray = dr.ItemArray;
                dtBand.Rows.RemoveAt(rowIndexFromMouseDown);
                dtBand.Rows.InsertAt(drr, rowIndexOfItemUnderMouseToDrop - 1);
            }
        }

不过只能拖拽一行,不能多行选中,这个可以再研究,出来了再贴上来

这是msdn 这个资源的地址,大家也可以看看

http://social.msdn.microsoft.com/forums/zh-CN/bffbfe12-ecd3-4854-956c-f02a0ec696c3/windows-forms#FAQ22


但是像我这样做了之后,你会发现,当同时用左键和右键,用作不同DataGridView或者一个DataGridView行的拖拽时,就会互相影响,到时最后什么都做不了,这当然是我代码的问题,不能什么东西都扔到一起混在一起。