Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

윈폼개발

닷넷을 기반으로 한 윈도우 응용프로그램 개발 지식을 다룹니다. 비지니스 응용프로그램을 위한 닷넷 윈폼 응용프로그램은 아주 강력합니다

[드래그&드랍] 컨트롤간 Data 이동

작성자 : 박종명
최초 작성일 : 2008-06-26 (목요일)
최종 수정일 : 2008-06-26 (목요일)
조회 수 : 3746

앞서, 드래그 앤 드랍 구현 방법에 대해서 알아본적이 있습니다
이전 샘플에서는 컴퓨터의 특정 파일을 끌어서 윈폼 텍스트 박스에 드랍하는 내용이었는데요...

이번에는 윈폼 컨트롤 사이에 Data 를 드래그 앤 드랍으로 이동한는 샘플을 제작해 보겠습니다.

, 드래그하는 대상이 파일에서 컨트롤로 바뀌는 것이 되겠네요

우선 아래와 같이 폼위에 Treeview ListBox 를 올리고 Node 를 추가합니다.

Treeview Name : tvUser
ListBox Name : lbSelectedUsers 

 그리고 폼이 로드될때 트리뷰가 확장 되도록 폼 로드 이벤트에 다음과 같이 작성합니다.

 private void Form1_Load(object sender, EventArgs e)
 {
      this.tvUsers.ExpandAll();
 }


결과적으로 Treeview 의 이름을 끌어서 ListBox 에 놓으면 ListBox 에 그 이름이 추가되어야 하는데요..

일단 끌기의 대상이 되는 Treeview 에 뭔가의 처리를 해 줘야 하는데요..
이를 위해 윈폼의 Control 클래스는 DoDragDrop 메서드를 제공합니다.

Treeview 역시 Control 클래스로 부터 상속된 클래스 이기에 이 메서드를 호출하면 됩니다.
아래는 DoDragDrop 메서드의 시그너쳐 입니다.

 public DragDropEffects DoDragDrop (Object data, DragDropEffects allowedEffects)

 이제 이 메서드를 Treeview MouseDown 이 발생할때 호출하도록 합니다.

 

private void tvUsers_MouseDown(object sender, MouseEventArgs e)
{
       TreeNode selectedNode = this.tvUsers.GetNodeAt(e.X, e.Y);

       if (selectedNode != null)
       {
           string userName = selectedNode.Text;

           this.tvUsers.DoDragDrop(userName, DragDropEffects.Copy);

           this.tvUsers.SelectedNode = selectedNode;
       }
}

 

우리는 Treeview 의 사용자 이름을 이동할 것이기 때문에 선택된 Treeview 의 사용자 이름을 '끌 데이터' 로 지정하고
끌어서 놓기 작업 효과로 DragDropEffects.Copy 를 지정합니다.

 다음으로 이전에 알아봤던 내용처럼, 끌어서 놓을 타깃 컨트롤에 DragEnter,DragDrop 이벤트를 구독합니다.

 

 private void lbSelectedUsers_DragEnter(object sender, DragEventArgs e)
 {          
     if (e.Data.GetDataPresent(DataFormats.Text))
     {
         e.Effect = DragDropEffects.Copy;
     }
     else
     {
         e.Effect = DragDropEffects.None;
     }
 }

 

 

private void lbSelectedUsers_DragDrop(object sender, DragEventArgs e)
 {
     string userName = (string)e.Data.GetData(DataFormats.Text);                  
     this.lbSelectedUsers.Items.Add(userName);
 }

 

위 내용은 이전 글에서 설명한 내용을 참고 해 주시면 됩니다

간단하게 정리하면, 타겟 컨트롤에 개체를 끌면 발생하는 DragEnter  이벤트에서는 해당 데이터가 유효한지 확인을 하고
끌어서 놓기 작업이 완료되면 발생하는 DragDrop 이벤트에서는 데이터를 가져와서 ListBox에 추가하는 로직입니다.

다음은 끌어서 놓기 작업효과를 나타내는 DragDropEffects 열거형에 대한 설명입니다.

 

멤버 이름

설명

 

All

데이터가 복사되고 끌기 소스에서 제거된 다음 놓기 대상에 스크롤됩니다

 

Copy

데이터가 놓기 대상에 복사됩니다

 

Link

끌기 소스의 데이터가 놓기 대상에 링크됩니다

 

Move

끌기 소스의 데이터가 놓기 대상으로 이동됩니다

 

None

놓기 대상이 데이터를 허용하지 않습니다

 

Scroll

스크롤 작업이 막 시작하려는 중이였거나 놓기 대상에서 현재 진행 중입니다

 

이름
비밀번호
홈페이지
RI <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요