GSI

.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);
}

Posted by gsi
: