美文网首页
C#DataGridView如何拖动行

C#DataGridView如何拖动行

作者: 堆石成山 | 来源:发表于2024-02-21 14:13 被阅读0次

DataGridView编辑好行内容后,有时需要交换行的位置,这个动作实现效果如下:


DGV拖动行效果.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# 拖放行
对其优化了下。

相关文章

网友评论

      本文标题:C#DataGridView如何拖动行

      本文链接:https://www.haomeiwen.com/subject/posbadtx.html