본문 바로가기
📁 [4] 개발자 정보 & 코드 노트/C#

C# Windows Forms 강의 102편: Drag & Drop을 활용한 파일 및 데이터 처리

by wawManager 2025. 5. 16.

반응형

 

1. 강의 개요

이번 강의에서는 Windows Forms에서 Drag & Drop(드래그 앤 드롭) 기능을 구현하는 방법을 학습합니다.
사용자가 파일을 폼 위로 끌어다 놓으면 파일을 자동으로 처리하고,
DataGridView 내에서 데이터를 드래그하여 정렬하는 기능을 추가합니다.


2. 학습 목표

✅ 파일을 폼으로 Drag & Drop하는 기능 구현
✅ DataGridView에서 행을 드래그하여 정렬하는 기능 추가
✅ UI 이벤트를 활용하여 사용자 경험 향상


3. 기능 요구사항

🟢 필수 기능

1️⃣ 파일 Drag & Drop 기능

  • 사용자가 파일을 폼으로 드래그하면 파일 목록이 ListBox에 추가됨

2️⃣ DataGridView 데이터 Drag & Drop 정렬

  • 사용자가 DataGridView의 행을 드래그하여 이동 가능

3️⃣ UI 응답성 유지

  • 애플리케이션 실행 중에도 원활한 이벤트 처리 제공

4. 실습: Drag & Drop 기능 구현

1️⃣ 폼 구성

  • 폼(Form) 이름: Form1
  • 컨트롤 배치:

컨트롤 타입 이름 위치 크기

ListBox lstFiles 좌측 (250 x 300)
DataGridView dgvData 우측 (250 x 300)

📌 폼 디자인 예시:

------------------------------------------------
| [ lstFiles ]     | [  dgvData  ]             |
| (파일 목록)      | (드래그 정렬 가능)         |
------------------------------------------------

2️⃣ 코드 작성

(1) 파일 Drag & Drop 기능 구현

using System;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp_DragDrop
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            InitializeDragDrop();
        }

        private void InitializeDragDrop()
        {
            this.AllowDrop = true;
            this.DragEnter += Form1_DragEnter;
            this.DragDrop += Form1_DragDrop;
        }

        // 파일이 폼 위로 올라왔을 때 이벤트
        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.Copy;
            }
        }

        // 파일이 폼에 드롭되었을 때 이벤트
        private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            foreach (string file in files)
            {
                lstFiles.Items.Add(Path.GetFileName(file)); // 파일 이름 추가
            }
        }
    }
}

(2) DataGridView 내에서 행 Drag & Drop 정렬 기능

        private void InitializeDataGridView()
        {
            dgvData.AllowDrop = true;
            dgvData.MouseDown += DgvData_MouseDown;
            dgvData.DragEnter += DgvData_DragEnter;
            dgvData.DragDrop += DgvData_DragDrop;

            // 샘플 데이터 추가
            dgvData.ColumnCount = 2;
            dgvData.Columns[0].Name = "ID";
            dgvData.Columns[1].Name = "이름";
            dgvData.Rows.Add("1", "Apple");
            dgvData.Rows.Add("2", "Banana");
            dgvData.Rows.Add("3", "Cherry");
        }

        private void DgvData_MouseDown(object sender, MouseEventArgs e)
        {
            if (dgvData.SelectedRows.Count > 0)
            {
                dgvData.DoDragDrop(dgvData.SelectedRows[0], DragDropEffects.Move);
            }
        }

        private void DgvData_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(typeof(DataGridViewRow)))
            {
                e.Effect = DragDropEffects.Move;
            }
        }

        private void DgvData_DragDrop(object sender, DragEventArgs e)
        {
            Point clientPoint = dgvData.PointToClient(new Point(e.X, e.Y));
            DataGridView.HitTestInfo hit = dgvData.HitTest(clientPoint.X, clientPoint.Y);

            if (hit.RowIndex >= 0)
            {
                DataGridViewRow draggedRow = (DataGridViewRow)e.Data.GetData(typeof(DataGridViewRow));
                dgvData.Rows.Remove(draggedRow);
                dgvData.Rows.Insert(hit.RowIndex, draggedRow);
            }
        }

(3) Designer 코드

        private void InitializeComponent()
        {
            this.lstFiles = new ListBox();
            this.dgvData = new DataGridView();

            // ListBox 설정
            this.lstFiles.Location = new System.Drawing.Point(10, 10);
            this.lstFiles.Size = new System.Drawing.Size(250, 300);

            // DataGridView 설정
            this.dgvData.Location = new System.Drawing.Point(270, 10);
            this.dgvData.Size = new System.Drawing.Size(250, 300);

            // Form 설정
            this.ClientSize = new System.Drawing.Size(540, 330);
            this.Controls.Add(this.lstFiles);
            this.Controls.Add(this.dgvData);
            this.Text = "Drag & Drop 구현";
        }

3️⃣ 실행 결과

파일 Drag & Drop 기능

  • 사용자가 파일을 폼으로 끌어다 놓으면 ListBox에 파일명이 추가됨.

DataGridView 행 Drag & Drop 정렬 기능

  • 사용자가 행을 드래그하면 순서를 변경할 수 있음.

5. 주요 개념 요약

  • DragEnter 이벤트: 드래그한 항목이 폼 위에 올라왔을 때 호출됨.
  • DragDrop 이벤트: 드래그한 항목이 폼에 드롭되었을 때 처리.
  • DoDragDrop(): 사용자가 선택한 항목을 드래그할 수 있도록 설정.
  • DataGridView 정렬: 사용자가 행을 드래그하여 순서를 변경하도록 설정.

📌 #CSharp #WindowsForms #DragDrop #파일처리 #DataGridView정렬

반응형