2012-02-25 4 views
2

enter image description here동일한 ListView에서 항목을 드래그 앤 드롭하는 방법은 무엇입니까?

이 파일과 폴더를 표시하는 ListView를이다 고려, 난 이미 복사/이동// 쇼 속성의 이름을 변경 ... 등을위한 코드를 작성하고 난 그냥 한 번 더 마지막이 필요합니다. Windows 탐색기에서와 같은 ListView 끌어서 놓기 방법, 이동 및 복사 기능이 있고 일부 사용자가 일부 폴더 또는 다른 방법으로 전화를 이러한 두 매개 변수를 가져올 필요가 항목을 가져올 필요가 복사본 function

void copy(ListViewItem [] droppedItems, string destination path) 
{ 
// Copy target to destination 
} 
+0

Windows의 끌어서 놓기 작업은 DragEnter, DragLeave 및 DragDrop의 3 가지 간단한 이벤트를 사용하여 수행 할 수 있습니다. 정확한 정보는 ** ** [Link] (http://www.c-sharpcorner.com/UploadFile/skulkarni/ImlementingDragandDropinListViewControls11252005035642AM/ImlementingDragandDropinListViewContConts.aspx) **를 참조하십시오 .... –

답변

4

목록보기의 AllowDrop 속성을 true로 설정하여 시작하십시오. 드래그 시작을 감지하기 위해 ItemDrag 이벤트를 구현합니다.

bool privateDrag; 

    private void listView1_ItemDrag(object sender, ItemDragEventArgs e) { 
     privateDrag = true; 
     DoDragDrop(e.Item, DragDropEffects.Copy); 
     privateDrag = false; 
    } 

다음으로는 DragEnter 이벤트가 필요합니다, 즉시 실행됩니다 : 그게 D + D에만 컨트롤의 내부 작동하는지 확인하기 위해 개인 변수를 사용합니다

private void listView1_DragEnter(object sender, DragEventArgs e) { 
     if (privateDrag) e.Effect = e.AllowedEffect; 
    } 

다음으로 사용자가 드롭 할 수있는 항목을 선택해야합니다. DragOver 이벤트가 필요하며 어느 항목을 마우스로 가리키고 있는지 확인해야합니다. 폴더를 나타내는 항목과 일반 '파일'항목을 구별해야합니다. 이렇게 할 수있는 한 가지 방법은 ListViewItem.Tag 속성을 사용하는 것입니다. 예를 들어 폴더의 경로로 설정할 수 있습니다. 여러 항목을 다음 드래그가 ListView.SelectedIndices 속성을 개체를 만드는 드래그 지원하려면

private void listView1_DragOver(object sender, DragEventArgs e) { 
     var pos = listView1.PointToClient(new Point(e.X, e.Y)); 
     var hit = listView1.HitTest(pos); 
     if (hit.Item != null && hit.Item.Tag != null) { 
      var dragItem = (ListViewItem)e.Data.GetData(typeof(ListViewItem)); 
      copy(dragItem, (string)hit.Item.Tag); 
     } 
    } 

:이 코드 작업을 만들기.

+0

ummm 감사합니다. 그러나 드롭하기 전에 항목을 강조 표시합니다. ? –

+0

DragOver 이벤트에서 왜 선택하지 않습니까? –

+0

DragOver 이벤트는 표시 효과를위한 것으로 생각되며 실제로 항목을 삭제하려면 DragDrop 이벤트 처리가 있어야합니다. – i486

관련 문제