2012-05-01 3 views
1

나는 내 자신의 사건을 경험 한 적이 거의 없다. 현재 양식을 처리하고 이벤트를 처리하기 위해 컨트롤을 사용하고 있으므로 WinForm 방식을 사용하여 이벤트를 처리하려고합니다.DragDrop 이벤트를 통해 데이터를 전달하는 방법은 무엇입니까?

WinForm 컨트롤에는 이미 자체 이벤트가 있습니다. 이벤트는 특정 델리게이트 형식으로 만들어 졌기 때문에 이벤트 중에 진행되는 작업을 처리하는 데 사용하는 메서드에서 대리자 서명을 일치시켜야합니다. 내가 알 수있는 한, 이것은 이벤트 처리기에서 두 개의 매개 변수 (즉, 소스 ObjectEventArgs)를 가져와야 함을 의미합니다.

DragDrop 관련 이벤트를 통해 컨트롤간에 다양한 정보를 전달하는 방법을 알아 내려고하고 있습니다. 여러 상황에서 온라인으로 다양한 코드 스 니펫을 찾을 수 있었지만 정보가 실제로 전달되는 방식을 더 잘 이해하고 싶습니다.

특히 DragDrop 이벤트에는 내 정보가 DataObject으로 전달됩니다. 이것은 차례로 매개 변수로 DragDrop.DoDragDrop 메소드에 전달됩니다.

여기 내 이해가 줄어들 기 시작합니다. 필자가 보았던 대부분의 예제에서는 일종의 데이터 형식이 지정된 것처럼 보입니다. 데이터 형식 자체는 string 유형입니다. 일반적으로 데이터 형식은 데이터와 함께 DataObject으로 전달됩니다.

이 데이터 형식의 기능은 무엇입니까? 관련된 데이터의 유형 만 표시하고 있습니까? 데이터 형식이 테스트 된 예제를 보았고 데이터 형식이 무엇인지에 따라 다양한 동작이 발생했습니다. 유형을 확인하기 위해 typeof (YourData)를 수행 할 수 없습니까? 나는 데이터 포맷이 어떻게 유용한 지 이해하지 못한다. 상기 링크

http://msdn.microsoft.com/en-us/library/ms741842.aspx

는, 첫 번째 예는 데이터 형식이 지정되지되면서 생성 될 DataObject 나타낸다. 데이터 형식이 자동으로 선택되고 개체가 기본적으로 변환된다는 설명입니다.

DataObject에 개체를 전달할 수 있습니까? 그런 다음 대상 컨트롤에서 DragDrop 이벤트가 발생하면 해당 컨트롤이 전달 된 메서드 및 필드에 액세스 할 수 있습니까? 또는 객체가 DataObject에 의해 다른 형식으로 변환됩니까? 다양한 구조는 어떨까요?

또한 Windows 탐색기 아이콘에서 내 양식으로 일부 끌어서 놓기 작업을 수행했습니다. 내가 찾은 예제 코드로 아이콘의 파일 경로를 얻을 수있었습니다. 또한 데이터 형식을 사용했습니다.

if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
{ 
    e.Effect = DragDropEffects.Copy; 
} 

요약 : 나는 데이터의 WinForm 이벤트를 통해 전달되는 방법에 대한 이해를 얻으려고 . 다양한 DragDrop 예제에서 내가 본 것을 이해하지 못합니다. 나는 데이터가 어떻게 든 다양한 형식으로 저장된다는 것과 그 데이터를 추출 할 수있는 방법이 있다는 것을 이해한다. 나는 데이터 형식이 사용되는 것을 이해하지 못한다. 정확히 어떤 종류의 데이터가 DataObject을 통해 전송 될지 이해하지 못합니다. EventArgs에 대한 일반적으로 이해가 부족합니다.

여기에서 언급 한 내용에 자유롭게 의견을 말하십시오. 내가 잘못 말한 것을 지적하십시오. 이 주제를 더 잘 이해하는 데 도움이 될만한 것이 있으면 감사하겠습니다.

편집 : 나는 이것으로 어디로 갈 계획을 결정했다. 어쩌면 누군가가 내가 한 것에 대해 설명 할 수있는 방법으로 사용할 수 있습니다.

특정 유형의 컨트롤이 포함 된 양식이 있습니다. 컨트롤의 배치를 고도로 사용자 정의 가능하고 동적으로하려고 노력 중입니다. 사용자가 폼에 다른 컨트롤을 추가 할 때마다 모든 컨트롤이 순서대로 정렬되도록 자동으로 위치가 변경됩니다.

현재 사용자가 컨트롤을 드래그하여 위치를 조정할 수 있도록하려고합니다. 사용자가 컨트롤을 놓을 곳을 결정할 때마다 다른 모든 컨트롤이 이동 컨트롤을위한 공간을 만들기 위해 방해가되지 않게됩니다.

드래그 한 컨트롤과 폼의 다른 모든 컨트롤을 제대로 이동하려면 드래그 한 컨트롤에서 특정 정보를 가져올 수 있어야합니다. 이벤트를 통해 전달되어야하는 주요 데이터는 System.Drawing.Point 구조를 사용하는 Location 속성의 형태를 취합니다.

답변

0

이 문제는 드래그를 사용하여 해결되지 않아야한다고 생각합니다. & drop. 드래그 & 드롭은 여러 어플리케이션이 데이터를 교환하는 방법입니다. 드래그하는 데이터가 현재 프로세스에서만 의미가있는 경우 끌기 & 드롭을 사용하지 마십시오.

필요한 모든 데이터를 저장하기 위해 필드 (예 : 포함하는 양식의 인스턴스에있는 필드)를 사용할 수 있습니다.

방금 ​​말해서 : 드래그 & 드롭은 컨트롤을 드래그하는 방법이 아닙니다. 어쨌든 많은 사용자 정의 논리가 필요합니다. dnd의 내장 기능이 여기에 도움이되는 것과는 다릅니다.

+0

DnD가 아니라고 말하면 DnD를 데이터 이동 수단으로 구체적으로 이야기하고 있습니까? 다양한 정보를 유지하기 위해 다른 클래스의 필드를 사용하는 방법을 생각할 때 드래그 이벤트를 사용하는 방법을 생각할 수 없습니다. 또한 응용 프로그램간에 DnD를 사용해야한다고 언급했습니다. 이것은 DragEventArgs에 데이터 형식이있는 이유를 설명 할 수 있습니까? 내 응용 프로그램 내에서 데이터 형식은 나에게 조금 이상하게 보였다. – Cheese

+0

예, 데이터 형식은 앱 (텍스트, HTML, 파일 목록, ...)간에 데이터를 교환하는 표준화 된 방법입니다. 사용자 정의 형식을 쓰는 것은 다른 응용 프로그램에서 의미가 없기 때문에 아무 도움이되지 않습니다. – usr

1

어떻게 완료했는지에 대한 아이디어를 제공합니다.

먼저 양식에 두 개의 패널을 놓고 색상을 두 가지 색상으로 설정하십시오.

public Form1() 
{ 
    InitializeComponent(); 

    panel1.MouseDown += new MouseEventHandler(panel1_MouseDown); 
    panel2.AllowDrop = true; 
    panel2.DragEnter += new DragEventHandler(panel2_DragEnter); 
    panel2.DragDrop += new DragEventHandler(panel2_DragDrop); 
} 

void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    panel1.DoDragDrop(panel1, DragDropEffects.Move); 
} 

void panel2_DragEnter(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetData(typeof(Panel)) != null) e.Effect = DragDropEffects.Move; 
} 

void panel2_DragDrop(object sender, DragEventArgs e) 
{ 
    Panel p = sender as Panel;//Not needed in this case. Could just write panel2. 
    Panel dropped = (Panel)e.Data.GetData(typeof(Panel)); 
    dropped.Location = p.PointToClient(new Point(e.X, e.Y)); 
    p.Controls.Add(dropped); 
} 

그런 다음 panel1을 panel2로 드래그하십시오.

관련 문제