美文网首页
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