-
[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); } } } }
'프로그래밍 > C#' 카테고리의 다른 글
C# UnitTest 사용하기 (MsTest) (0) 2021.03.22 [C#] error CS0052 : 일관성 없는 엑세스 가능성 (0) 2021.03.11 [C#] ContextMenuStrip Size 조절 (3) 2020.11.06 [C#] virtual, abstract, interface (2) 2020.11.05 [C#] Delegate 를 이용해 폼 간 데이터 전송하기 (0) 2020.10.08