ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] DataGridView Drag&Drop (row 단위)
    프로그래밍/C# 2021. 3. 18. 19:37

     한 줄 Drag & Drop 하기

    C# 의 DataGridView 도구를 통해서 한 줄씩 Drag & Drop 이 가능하도록 구현해봅시다. 우선 기본 폼에 DataGridView 를 원하는 크기만큼 설정해줍니다. 값은 코드를 통해서 넣을 예정이니 아무 작업도 하지 말고 코드를 복사해서 넣어주시면 됩니다.

     

    사용하는 이벤트는 4가지로 MouseMove, MouseDown, DragOver, DragDrop 입니다.

     

    MouseMove : 끌어서 놓기 작업을 수행하는 동안의 효과를 지정해줍니다.

    MouseDown : 처음 클릭한 지점의 위치정보를 가져옵니다.

    DragOver : DragDropEffects 를 결정합니다. (ex. 복사,이동 ...)

    DragDrop : Drop 시점의 이벤트를 설정합니다.

     

    한 줄을 옮기는 방법은 간단합니다. 마우스 클릭 지점과 가장 가까운 RowIndex 정보를 가져와서 해당 행을 삭제하고 원하는 위치에 Insert 를 시켜주는 겁니다. 다음 게시물에서는 Cell 단위를 옮기는 코드를 포스팅하겠습니다.

     

     Source Code

     

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace gridViewTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                // 초기값 설정
                dataGridView.ColumnCount = 2;
                dataGridView.Columns[0].Name = "First";
                dataGridView.Columns[1].Name = "Last";
                dataGridView.Columns["First"].HeaderText = "First Name";
                dataGridView.Columns["Last"].HeaderText = "Last Name";
                dataGridView.Columns["First"].SortMode = DataGridViewColumnSortMode.Programmatic;
                dataGridView.Columns["Last"].SortMode = DataGridViewColumnSortMode.Programmatic;
    
                dataGridView.Rows.Add(new string[] { "1", "딸기"});
                dataGridView.Rows.Add(new string[] { "2", "바나나" });
                dataGridView.Rows.Add(new string[] { "3", "메론" });
                dataGridView.Rows.Add(new string[] { "4", "파인에플" });
                dataGridView.Rows.Add(new string[] { "5", "수박" });
    
                // 이벤트 함수 설정
                this.dataGridView.MouseMove += dataGridView_MouseMove;
                this.dataGridView.MouseDown += dataGridView_MouseDown;
                this.dataGridView.DragOver += dataGridView_DragOver;
                this.dataGridView.DragDrop += dataGridView_DragDrop;
                this.dataGridView.AllowDrop = true;
            }
    
            // 이벤트 함수에 필요한 변수
            private Rectangle dragBoxFromMouseDown;
            private int rowIndexFromMouseDown;
            private int rowIndexOfItemUnderMouseToDrop;
            private int columnIndexOfItemUnderMouseToDrop;
            
            private void dataGridView_MouseMove(object sender, MouseEventArgs e)
            {
                if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
                {
                    if (dragBoxFromMouseDown != Rectangle.Empty &&
                        !dragBoxFromMouseDown.Contains(e.X, e.Y))
                    {
                        DragDropEffects dropEffect = dataGridView.DoDragDrop(dataGridView.Rows[rowIndexFromMouseDown], DragDropEffects.Move);
                    }
                }
            }
    
            private void dataGridView_MouseDown(object sender, MouseEventArgs e)
            {
                rowIndexFromMouseDown = dataGridView.HitTest(e.X, e.Y).RowIndex;
                if (rowIndexFromMouseDown != -1)
                {
                    Size dragSize = SystemInformation.DragSize;
    
                    dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2), e.Y - (dragSize.Height / 2)), dragSize);
                }
                else
                    dragBoxFromMouseDown = Rectangle.Empty;
            }
    
            private void dataGridView_DragOver(object sender, DragEventArgs e)
            {
                e.Effect = DragDropEffects.Move;
            }
    
            private void dataGridView_DragDrop(object sender, DragEventArgs e)
            {
    
                Point clientPoint = dataGridView.PointToClient(new Point(e.X, e.Y));
                rowIndexOfItemUnderMouseToDrop = dataGridView.HitTest(clientPoint.X, clientPoint.Y).RowIndex;
    
                if (e.Effect == DragDropEffects.Move)
                {
                        // get 한 행을 삭제하고 원하는 위치에 넣어줍니다.
                        DataGridViewRow rowToMove = e.Data.GetData(typeof(DataGridViewRow)) as DataGridViewRow;
                        dataGridView.Rows.RemoveAt(rowIndexFromMouseDown);
                        dataGridView.Rows.Insert(rowIndexOfItemUnderMouseToDrop, rowToMove);
                }
            }
        }
    }
    

    댓글

Designed by Tistory.