드롭을 받는 컨트롤은 Allow&Drop 프로퍼티를 true로 변경해야 합니다.
드래그앤드롭을 받는 방법
드래그 시작 메서드
DragDropEffects DoDragDrop(Object data, DragDropEffects allowedEffects)
Data는 드래그되는 대상입니다.
allowedEffects는 드롭할 때 어떤 동작을 행하는 가를 지정하는 플래그의 조합입니다.
Copy, Move, Link, Scroll, All, None 등이 있습니다.
이 메서드의 리턴값은 허용한 동작의 값입니다.
드래그 중에 드롭을 받을 컨트롤에 발생하는 이벤트
DragEnter: 컨트롤 안에 최초로 들어왔을 때 발생 – 드롭을 받기위한 준비 작업
DragOver: 컨트롤위에서 마우스 이동 시 발생
DragEventArgs객체가 넘어옵니다.
X, Y: 좌표
Data: 드래그 되고 있는 객체입니다.
KeyState: 마우스와 키보드의 조합(왼쪽(1), 오른쪽(2), Shift(4), Ctrl(8), 가운데(16), Alt(32))입니다.
AllowedEffect: 드래그를 시작한 곳에서 허용한 동작
Effects: 드롭을 할 때 취할 동작으로 마우스 커서의 모양이 변경됩니다.
DragLeave: 컨트롤의 범위를 벗어날 때 발생하는 이벤트
DragDrop: 컨트롤 위에서 마우스를 해제할 때 발생하는 이벤트로 DragOver와 매개변수가 동일합니다.
드래그를 한 원본에서는 QueryContinueDrag 이벤트가 발생합니다.
이 때는 매개변수로 QueryContinueDragEventArgs의 객체가 넘어오는데 이 객체에는 아래와 같은 멤버가 포함됩니다.
Action: 연결된 끌어서 놓기 작업의 현재 상태를 가져오거나 설정합니다.
EscapePressed: Esc 키를 눌렀는지 여부를 나타내는 부울 값을 가져옵니다.
KeyStates: Shift, Ctrl 및 Alt 키의 현재 상태와 마우스 단추의 상태를 나타내는 플래그 열거형을 가져옵니다.
Source:이벤트를 발생시킨 개체에 대한 참조를 가져오거나 설정합니다.
예제1) 2개의 리스트 박스에서 드래그앤 드랍 처리
1. 폼에 2개의 리스트 박스를 배치
왼쪽 리스트박스에 적당히 데이터를 입력합니다.
국어, 영어, 수학, 물리
2. 오른쪽의 리스트 박스의 AllowDrop 속성을 true로 설정합니다.
3. 왼쪽 리스트 박스의 MouseDown 이벤트 작성
Graphics DC = CreateGraphics();
DragDropEffects effect;
int index = listBox1.IndexFromPoint(e.X, e.Y);
if (index != ListBox.NoMatches)
{
DC.DrawString("드래그 시작", Font, Brushes.Black, 0, 0);
string item = (string)listBox1.Items[index];
effect = DoDragDrop(item, DragDropEffects.Copy | DragDropEffects.Move);
if (effect == DragDropEffects.Move)
{
listBox1.Items.RemoveAt(index);
}
DC.Dispose();
}
4. 왼쪽 리스트 박스의 QueyContinueDrag 이벤트에 작성
if (e.EscapePressed)
e.Action = DragAction.Cancel;
5. 오른쪽 리스트 박스의 DragOver 이벤트 작성
if (e.Data.GetDataPresent(DataFormats.StringFormat))
{
if ((e.KeyState & 8) != 0)
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.Move;
}
}
6. 오른쪽 리스트 박스의 DragDrop 이벤트에 작성
if (e.Data.GetDataPresent(DataFormats.StringFormat))
{
listBox2.Items.Add(e.Data.GetData(DataFormats.StringFormat));
}
예제2) 파일 드래그 앤 드랍
1. 폼에 레이블 2개와 텍스트 박스와 PictureBox를 배치
텍스트 박스의 MultiLine 속성을 true로 변경
텍스트 박스와 폼의 AllowedDrop 속성을 true로 변경
2. 텍스트 상자의 DragOver 이벤트 작성
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Move;
}
3. 텍스트 상자의 DrapDrop 이벤트 작성
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
textBox1.Text+= file + "\r\n";
}
}
4. 폼의 DragOver 이벤트 작성
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Move;
}
5. 폼의 DrapDrop 이벤트 작성
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
pictureBox1.Image = Image.FromFile(files[0]);
}