Freigeben über


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

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

Ziehen von Daten

Drag & Drop-Operationen 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-Operationen 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.

Tipp

Bestimmte Steuerelemente verfügen über benutzerdefinierte, für den Ziehvorgang typische Ereignisse. Das ListView-Steuerelement und das TreeView-Steuerelement verfügen beispielsweise über ein ItemDrag-Ereignis.

So starten Sie einen Ziehvorgang

  • 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 demonstriert, 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);
    }
    
    private void button1_MouseDown(Object sender,
    System.Windows.Forms.MouseEventArgs e)
    {
       button1.DoDragDrop(button1.get_Text(), DragDropEffects.Copy |
          DragDropEffects.Move);
    }
    

    Tipp

    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). Dass generell jedoch beliebige Daten verwendet werden können, sollte bei der Integration von Drag & Drop-Operationen in Windows-basierte Anwendungen stets beachtet werden.

Während ein Ziehvorgang durchgeführt wird, können Sie das QueryContinueDrag-Ereignis behandeln, das beim System rückfragt, 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 in einem TreeView-Steuerelement, wenn mit dem Cursor darauf gezeigt wird.

Ablegen von Daten

Wenn Sie begonnen haben, Daten von einer Stelle einer Windows Form oder eines Steuerelements zu ziehen, möchten Sie diese natürlich auch an einer Stelle 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. Um Bereiche in Windows Forms oder Steuerelementen so zu konfigurieren, dass abgelegte Daten angenommen werden, richten Sie die AllowDrop-Eigenschaft ein, und behandeln Sie das DragEnter-Ereignis und das DragDrop-Ereignis.

So führen Sie das Ablegen aus

  1. Legen Sie die AllowDrop-Eigenschaft 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;
    }
    
    private void textBox1_DragEnter(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       if (e.get_Data().GetDataPresent(DataFormats.Text))
          e.set_Effect(DragDropEffects.Copy);
       else
          e.set_Effect(DragDropEffects.None);
    }
    

    Tipp

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

  3. Verwenden Sie im DragDrop-Ereignis für das Steuerelement, in dem der Ablegevorgang erfolgt, die GetData-Methode, um die gezogenen Daten abzurufen. Weitere Informationen finden Sie unter DtaObject.Data-Eigenschaft.

    Im folgenden Beispiel ist das Steuerelement, auf das die Daten gezogen werden (und auf dem der Ablegevorgang erfolgt), ein TextBox-Steuerelement. Durch den Code wird die Text-Eigenschaft des TextBox-Steuerelements genauso festgelegt wie die gezogenen Daten.

    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();
    }
    
    private void textBox1_DragDrop(Object sender,
    System.Windows.Forms.DragEventArgs e)
    {
       textBox1.set_Text
    (e.get_Data().GetData(DataFormats.Text).ToString());
    }
    

    Tipp

    Darüber hinaus können Sie die KeyState-Eigenschaft verwenden, sodass in Abhängigkeit von den während der Drag & Drop-Operation 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.)

Siehe auch

Aufgaben

Gewusst wie: Hinzufügen von Daten zur Zwischenablage

Gewusst wie: Abrufen von Daten aus der Zwischenablage

Weitere Ressourcen

Drag & Drop-Operationen und Unterstützung der Zwischenablage