다음을 통해 공유


연습: Windows Forms에서 끌어서 놓기 작업 수행

Windows 기반 애플리케이션 내에서 끌어서 놓기 작업을 수행하려면 일련의 이벤트, 특히 DragEnter, DragLeaveDragDrop 이벤트를 처리해야 합니다. 이러한 이벤트의 이벤트 인수에서 제공하는 정보를 사용하면 끌어서 놓기 작업을 쉽게 구현할 수 있습니다.

데이터 끌기

모든 끌어서 놓기 작업은 끌기에서 시작됩니다. 끌기가 시작할 때 데이터를 수집할 수 있게 하는 기능은 DoDragDrop 메서드에서 구현됩니다.

다음 예제에서는 MouseDown 이벤트가 가장 직관적이기 때문에 끌기 작업을 시작하는 데 사용됩니다(대부분의 끌어서 놓기 작업은 마우스 단추를 누른 상태에서 시작됩니다). 그러나 모든 이벤트는 끌어서 놓기 프로시저를 시작할 수 있습니다.

참고

특정 컨트롤에는 사용자 지정 끌기 관련 이벤트가 있습니다. 예를 들어, ListViewTreeView 컨트롤에는 ItemDrag 이벤트가 있습니다.

끌기 작업을 시작하려면

  1. 끌기 작업이 시작될 컨트롤의 MouseDown 이벤트에서 DoDragDrop 메서드를 사용하여 끌어갈 데이터와 끌기 작업에 허용되는 효과를 설정합니다. 자세한 내용은 DataAllowedEffect를 참조하세요.

    다음 예제에서는 끌기 작업을 시작하는 방법을 보여 줍니다. 끌기 작업이 시작되는 컨트롤은 Button 컨트롤이고, 끌기 대상이 되는 데이터는 Button 컨트롤의 Text 속성을 나타내는 문자열이고, 허용되는 영향은 복사 또는 이동입니다.

    Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown  
       Button1.DoDragDrop(Button1.Text, DragDropEffects.Copy Or DragDropEffects.Move)  
    End Sub  
    
    private void button1_MouseDown(object sender,
    System.Windows.Forms.MouseEventArgs e)  
    {  
       button1.DoDragDrop(button1.Text, DragDropEffects.Copy |
          DragDropEffects.Move);  
    }  
    

    참고

    모든 데이터는 DoDragDrop 메서드의 매개 변수로 사용할 수 있으며, 위의 예제에서는 Button 컨트롤의 Text 속성은 (Button 컨트롤에서) 끌어오는 위치와 관련되기 때문에 (값을 하드 코딩하거나 데이터 세트에서 데이터를 검색하는 것 대신) 이 속성이 사용되었습니다. 끌어서 놓기 작업을 Windows 기반 애플리케이션에 통합할 때 이 점을 명심해 주세요.

끌기 작업을 수행하는 동안, QueryContinueDrag 이벤트를 처리할 수 있습니다. 이것은 끌기 작업을 계속하기 위해 시스템에 “권한을 요청”합니다. 이 메서드를 처리할 때, 끌기 작업에 영향을 미칠 메서드를 호출하는 것도 좋습니다(예: 커서가 가리킬 때 TreeView 컨트롤의 TreeNode 확장).

데이터 놓기

Windows Form 또는 컨트롤의 위치에서 데이터를 끌기 시작하면 당연히 다른 위치에 놓으려고 할 것입니다. 데이터를 놓도록 올바르게 구성된 양식이나 컨트롤의 영역 위에서 움직이면 커서가 변경됩니다. Windows Form 또는 컨트롤 내에 AllowDrop 속성을 설정하고 DragEnterDragDrop 이벤트를 처리하여 끌어 놓을 데이터를 수락할 영역을 마련할 수 있습니다.

놓기 작업을 수행하려면

  1. AllowDrop 속성을 true로 설정합니다.

  2. 놓기 작업이 발생하는 컨트롤의 DragEnter 이벤트에서 끌어오는 데이터의 형식이 적합한지(이 경우, Text) 확인합니다. 그런 다음 코드에서 놓기 작업으로 인해 발생하는 효과를 DragDropEffects 열거형의 값으로 설정합니다. 자세한 내용은 Effect를 참조하세요.

    Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter  
       If (e.Data.GetDataPresent(DataFormats.Text)) Then  
         e.Effect = DragDropEffects.Copy  
       Else  
         e.Effect = DragDropEffects.None  
       End If  
    End Sub  
    
    private void textBox1_DragEnter(object sender,
    System.Windows.Forms.DragEventArgs e)  
    {  
       if (e.Data.GetDataPresent(DataFormats.Text))
          e.Effect = DragDropEffects.Copy;  
       else  
          e.Effect = DragDropEffects.None;  
    }  
    

    참고

    자신의 개체를 SetData 메서드의 Object 매개 변수로 지정하여 자신의 DataFormats을 정의할 수 있습니다. 이 작업을 수행할 때 지정된 개체는 직렬화(serialize)할 수 있어야 합니다. 자세한 내용은 ISerializable를 참조하세요.

  3. 놓기 작업이 발생할 컨트롤의 DragDrop 이벤트에서 GetData 메서드를 사용하여 끌어오는 데이터를 검색합니다. 자세한 내용은 Data를 참조하세요.

    아래 예제에서 TextBox 컨트롤은 끌어오는 컨트롤(놓기 작업이 발생하는 위치)입니다. 코드는 TextBox 컨트롤의 Text 속성을 끌어오는 데이터와 같도록 설정합니다.

    Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop  
       TextBox1.Text = e.Data.GetData(DataFormats.Text).ToString  
    End Sub  
    
    private void textBox1_DragDrop(object sender,
    System.Windows.Forms.DragEventArgs e)  
    {  
       textBox1.Text = e.Data.GetData(DataFormats.Text).ToString();  
    }  
    

    참고

    또한 KeyState 속성을 사용하면 끌어서 놓기 작업 중에 누른 후 손을 뗀 키에 따라 특정 효과가 발생합니다(예: Ctrl 키를 누를 때 끌어온 데이터를 복사하는 것이 표준).

참고 항목