.Net WinForm DragAndDrop
C# 2008. 1. 7. 18:25 |.Net WinForm에서 작업을 하다 보면 MFC의 확장성과는 비교도 되지 않을 만큼 좋은 컨트롤들로 무장되어 있는거 같다. 아직까지 다양한 확장 기능을 사용하고 .Net 의 좋은 기능들에 대해서 많이 모르지만 어느정도 선까지는 MFC의 생산성과는 비교가 안되는거 같다.
오늘 ListView 두개를 사용해서 드래그앤 드롭을 처리해 봤다.
참 쉽다고 느껴 진다.
코드 내용을 우선 정리해 볼려고 한다.
드래그 앤 드롭에는 몇가지 용어가 나오게 된다.
1. 소스(Source)
2. 타깃(Target)
3. 드롭 소스, 드롭 타깃
더 있지만. 큰 주제를 놓고 본다면 이것이 있을 것이다.
여기서 말을 풀어 보면 아래와 같을 것이다.
에플리케이션에서 드래그 앤 드롭(drag and drop) 기능을 추가 하려면 드롭 타깃(drop target)과 드롭 소스(drop source)를 고려 해야 한다. 우선, "무언가를 끌어다(drag) 놓을(drop)컨트롤" 이 하나 있어야 한다. 이런 종류의 컨트롤을 드롭 타깃(drop target)이라고 한다. 컨트롤의 AllowDrop 속성을 true로 설정하면 해당 컨트롤을 드롭 타깃으로 만들 수 있다.
작업 순서를 보겠다.
1. 두개의 ListView를 추가
2. 타깃이 될 ListView에 AllowDrop를 true로 설정
3. 소스 ListView에 MouseDown() 이벤트 등록
4. 타깃 ListView에 DragDrop(), DragEnter() 이벤트 등록
5. 코드 작성
6. 테스트
//
private void listView1_MouseDown(object sender, MouseEventArgs e)
{
try
{
// 전달할 객체를 난 구조체를 사용하였다.
EffectInfo ef = new EffectInfo();
// 멀티 선택이 될수 있기 때문에 collection 객체로 받도록 한다.
ListView.SelectedListViewItemCollection breakfast = this.listView1.SelectedItems;
// 하나만 사용하기 위해서 개수를 검사 하고 throw로 던진다.
if (breakfast.Count != 1)
throw new Exception("멀티 선택 되었네요");
// 내부에서 하나만 연결후에 DoDragDrop()를 호출한다.
foreach (ListViewItem item in breakfast)
{
ef.imageidx = item.ImageIndex;
ef.itemname = item.Text;
// 드래그앤 드롭 시작.
DoDragDrop(ef, DragDropEffects.Copy);
}
}
catch (ArgumentException nullex)
{
}
catch (Exception ex)
{
}
}
private void listView2_DragEnter(object sender, DragEventArgs e)
{
// 타입을 검사 해서 커서 모양을 선택해 준다.
if (e.Data.GetDataPresent(typeof(EffectInfo)))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
private void listView2_DragDrop(object sender, DragEventArgs e)
{
// 드롭 했을때 값을 처리 한다.
EffectInfo ef = (EffectInfo)e.Data.GetData(typeof(EffectInfo));
ListViewItem listviewitem = new ListViewItem(ef.itemname, ef.imageidx);
this.listView2.Items.Add(listviewitem);
}