Exemplarische Vorgehensweise: Ausführen von Drag & Drop-Operationen in Windows Forms

Um Drag & Drop-Vorgänge in Windows-basierten Anwendungen auszuführen, müssen Sie eine Reihe von Ereignissen verarbeiten, insbesondere die Ereignisse DragEnter, DragLeave und DragDrop. Wenn Sie die Daten aus den Ereignisargumenten dieser Ereignisse verwenden, können Sie Drag & Drop-Vorgänge problemlos vereinfachen.

Ziehen von Daten

Drag & Drop-Vorgänge beginnen immer mit dem Ziehen (Dragging). Die Funktionalität, mit der Daten bei Beginn des Ziehvorgangs erfasst werden können, ist in der DoDragDrop-Methode implementiert.

Im folgenden Beispiel wird das MouseDown-Ereignis zum Starten des Ziehvorgangs verwendet, da es am intuitivsten ist. (Die meisten Drag & Drop-Vorgänge beginnen mit dem Drücken der Maustaste.) Beachten Sie dabei jedoch, dass für das Starten des Drag & Drop-Vorgangs jedes beliebige Ereignis verwendet werden kann.

Hinweis

Bestimmte Steuerelemente verfügen über benutzerdefinierte für Ziehvorgänge spezifische Ereignisse. Die Steuerelemente ListView und TreeView besitzen z. B. ein ItemDrag-Ereignis.

So starten Sie einen Zielvorgang

  1. Legen Sie die zu ziehenden Daten und die zulässige Wirkung des Ziehvorgangs mithilfe der DoDragDrop-Methode in dem MouseDown-Ereignis des Steuerelements fest, in dem der Ziehvorgang beginnen soll. Weitere Informationen finden Sie unter Data und AllowedEffect.

    Im folgenden Beispiel wird gezeigt, wie ein Ziehvorgang gestartet wird. Das Steuerelement, in dem der Ziehvorgang beginnt, ist ein Button-Steuerelement, die gezogenen Daten sind die Zeichenfolge, die die Text-Eigenschaft des Button-Steuerelements darstellen, und die zulässigen Auswirkungen sind entweder Kopieren oder Verschieben.

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

    Hinweis

    In der DoDragDrop-Methode können beliebige Daten als Parameter verwendet werden. Im Beispiel oben wurde die Text-Eigenschaft des Button-Steuerelements verwendet (anstatt einen Wert fest zu codieren oder Daten aus einem Dataset abzurufen), da die Eigenschaft mit der Position verbunden war, von der gezogen wurde (das Button-Steuerelement). Dies sollte bei der Integration von Drag & Drop-Vorgängen in Windows-basierte Anwendungen stets beachtet werden.

Während ein Ziehvorgang durchgeführt wird, können Sie das QueryContinueDrag-Ereignis behandeln, das beim System „um Erlaubnis fragt“, ob der Ziehvorgang fortgesetzt werden kann. Die Behandlung dieser Methode bietet außerdem die Gelegenheit, Methoden aufzurufen, die sich auf den Ziehvorgang auswirken, z. B. das Erweitern eines TreeNode-Steuerelements in ein TreeView-Steuerelement, wenn mit dem Cursor darauf gezeigt wird.

Ablegen von Daten

Nachdem Sie begonnen haben, Daten von einer Stelle einer Windows Form oder eines Steuerelements zu ziehen, möchten Sie diese natürlich auch irgendwo ablegen (Dropping). Der Cursor verändert sich, wenn er über einen Bereich auf einem Formular oder Steuerelement bewegt wird, der für das Ablegen von Daten konfiguriert ist. Jeder Bereich in einem Windows-Formular oder Steuerelement kann so bearbeitet werden, dass er abgelegte Daten akzeptiert, indem die AllowDrop-Eigenschaft festgelegt wird und die Ereignisse DragEnter und DragDrop behandelt werden.

So führen Sie einen Ablegevorgang aus

  1. Legen Sie die Eigenschaft AllowDrop auf „true“ fest.

  2. Stellen Sie im DragEnter-Ereignis für das Steuerelement, in dem Sie die gezogenen Daten ablegen, sicher, dass diese einem zulässigen Typ entsprechen (in diesem Fall Text). Der Code legt nun die Wirkung fest, die eintritt, wenn der Ablegevorgang für einen Wert in der DragDropEffects-Enumeration auftritt. Weitere Informationen finden Sie unter 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;  
    }  
    

    Hinweis

    Sie können Ihre eigenen DataFormats definieren, indem Sie Ihr eigenes Objekt als Object-Parameter der SetData-Methode angeben. Stellen Sie dabei sicher, dass das angegebene Objekt serialisierbar ist. Weitere Informationen finden Sie unter ISerializable.

  3. Verwenden Sie in dem DragDrop-Ereignis für das Steuerelement, in dem das Ablegen erfolgen wird, die GetData-Methode, um die Daten abzurufen, die gezogen werden. Weitere Informationen finden Sie unter Data.

    Im folgenden Beispiel ist das Steuerelement, auf das die Daten gezogen werden (und auf dem der Ablegevorgang erfolgt), ein TextBox-Steuerelement. Der Code legt die Text-Eigenschaft des TextBox-Steuerelements auf die gezogenen Daten fest.

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

    Hinweis

    Darüber hinaus können Sie die KeyState-Eigenschaft verwenden, sodass in Abhängigkeit von den während des Drag & Drop-Vorgangs gedrückten Tasten bestimmte Wirkungen erzielt werden. (So werden die gezogenen Daten beispielsweise beim Drücken der STRG-TASTE standardmäßig in die Zwischenablage kopiert.)

Weitere Informationen