본문 바로가기

.NET/WinForm

[WinForm] Drag & Drop으로 파일 가져오기

파일을 마우스로 끌어서 WinForm의 RichTextBox 컨트롤에 가져다 놓으면 파일을 읽어서 내용을 RichTextBox에 출력해주는 프로그램을 만들어본다.

 

기본적으로 WinForm의 컨트롤은 Drag&Drop에 대한 처리가 구현되지 않았기 때문에 아래와 같이 파일을 가져다 올리면 🚫와 같은 모양으로 마우스 커서가 바뀌고, 파일을 놓아도 아무 일도 발생하지 않는다.

 

Drag&Drop 이벤트를 구현하기 위해 몇 가지 단계를 거친다.

 

1. Drag&Drop을 처리할 컨트롤에서 AllowDrop 속성을 true로 설정해준다.

AllowDrop 속성은 컨트롤에서 끌어서 놓기 작업을 수행할 수 있는지의 여부를 나타내는 속성이다.

AllowDrop 속성. 기본값은 False이다.

만약 AllowDrop 속성이 속성 창에서 보이지 않는다면, 코드상에서 직접 AllowDrop 속성을 true로 해준다.

(RichTextBox의 경우 AllowDrop 속성의 Browsable 특성이 false이기 때문에 속성 창에서는 보이지 않을 것이다.)

public Form1()
{
	InitializeComponent();
    richTextBox1.AllowDrop = true;
}

 

2. DragEnter 이벤트를 생성한다.

DragEnter는 파일을 끌어 움직여서 컨트롤의 영역 안으로 가져왔을 때 발생하는 이벤트이다. (파일을 놓았을 때가 아니다! 즉, 마우스 버튼은 아직 눌려진 상태.)

 

DragEnter 이벤트는 아래와 같이 작성한다.

private void DragEnterEvent(object sender, DragEventArgs e)
{
	e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.All : DragDropEffects.None;
}

e.Data.GetDataPresent(DataFormats.FileDrop)은 현재 끌고 있는 개체가 파일인 경우 true가 된다.

DragDropEffects는 All, Copy, Move, Scroll, None이 있는데, 컨트롤 위에서 마우스 커서의 모양을 결정하는 데 사용된다.

All과 Copy는 + 모양이 있는 사각형 모양, Move는 그냥 사각형 모양, Scroll과 None은 금지 모양이 된다.

 

만약 끌어온 개체가 파일인 경우(= FileDrop인 경우) DragDropEffects를 All, Copy 또는 Move로 적절하게 설정하여 끌어온 파일을 이 컨트롤에 놓을 수 있음을 알린다.

그렇지 않은 경우 DragDropEffects를 None으로 하여 놓을 수 없음을 알린다.

 

 

3. DragDrop 이벤트를 생성한다.

DragDrop은 파일을 컨트롤 영역 안으로 가져와서 마우스 버튼을 놓았을 때 발생하는 이벤트이다.

또한 DragDrop 이벤트는 DragEnter 이벤트에서 DragDropEffects가 None으로 설정되었다면 실행되지 않으므로 DragDrop 이벤트에서 추가적으로 DataFormats를 검사할 필요는 없다.

 

이 예제에서는 파일의 내용을 읽어오는 프로그램을 작성하므로 DragDrop 이벤트를 다음과 같이 구현하였다.

private void DragDropEvent(object sender, DragEventArgs e)
{
	var files = (string[])e.Data.GetData(DataFormats.FileDrop, false);
    
    foreach(var f in files)
    {
    	using(var sr = new StreamReader(f))
        {
    		(sender as RichTextBox).AppendText(sr.ReadToEnd() + Environment.NewLine);
        }
    }
}

 

using 구문에 대한 설명은 아래 글의 2번 참조.

 

[C#] using 구문 사용법

using 키워드는 단순히 네임스페이스를 임포트할 때 뿐만 아니라 다른 용도로도 사용이 가능한데, using의 유용한 두 가지 기능을 소개한다. 1. 별칭 선언 using 키워드를 사용해 특정 타입의 별칭을

cs-solution.tistory.com

 

e.Data.GetData() 메서드로 드래그한 모든 파일의 파일명을 가져온 다음, 파일을 하나씩 열어서 RichTextBox 컨트롤에 Append해준다.

 

4. 생성한 이벤트들을 컨트롤에 등록한다.

DragEnter, DragDrop 이벤트 역시 기본적으로 Browsable 특성이 false 이기 때문에 이벤트 속성 창에는 표시되지 않으므로 생성자 쪽에서 직접 등록해줘야 한다.

public Form1()
{
	InitializeComponent();
    richTextBox1.AllowDrop = true;
    richTextBox1.DragEnter += DragEnterEvent;
    richTextBox1.DragDrop += DragDropEvent;
}

결과적으로 생성자는 위와 같은 형태를 띠게 된다.