Condividi tramite


Procedura dettagliata: Esecuzione di un'operazione di trascinamento in Windows Form

Per eseguire operazioni di trascinamento all'interno di applicazioni per Windows è necessario gestire una serie di eventi, in particolare gli eventi DragEnter, DragLeave e DragDrop. Utilizzando le informazioni disponibili negli argomenti event di questi eventi, è possibile semplificare le operazioni di trascinamento.

Trascinamento di dati

Tutte le operazioni di trascinamento degli elementi selezionati iniziano con il trascinamento. La funzionalità che consente di raccogliere i dati all'inizio dell'operazione di trascinamento è implementata nel metodo DoDragDrop.

Nell'esempio che segue viene utilizzato l'evento MouseDown per avviare l'operazione di trascinamento. Si tratta infatti del metodo più intuitivo, dato che la maggior parte delle operazioni di trascinamento degli elementi selezionati iniziano con la pressione del pulsante del mouse. È necessario tuttavia ricordare che per avviare una routine di trascinamento è possibile utilizzare qualsiasi evento.

Nota

Alcuni controlli dispongono di eventi personalizzati per il trascinamento. I controlli ListView e TreeView, ad esempio, dispongono di un evento ItemDrag.

Per iniziare un'operazione di trascinamento

  • Nell'evento MouseDownper il controllo del punto in cui inizia il trascinamento, utilizzare il metodo DoDragDrop per impostare i dati da trascinare e l'effetto consentito. Per ulteriori informazioni, vedere Data e AllowedEffect.

    Nell'esempio che segue viene illustrato come iniziare un'operazione di trascinamento. Il controllo in cui inizia il trascinamento è un controllo Button, i dati trascinati corrispondono alla stringa che rappresenta la proprietà Text del controllo Button e gli effetti consentiti sono la copia o lo spostamento.

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

    Nota

    Come parametro per il metodo DoDragDrop è possibile utilizzare qualsiasi dato. Nell'esempio precedente, la proprietà Text del controllo Button è utilizzata (al posto della specificazione a livello di codice di un valore o del recupero di dati da un set di dati) in quanto la proprietà era correlata alla posizione di origine del trascinamento (il controllo Button). È importante tenere presente tali aspetti durante l'inserimento delle operazioni di trascinamento nelle applicazioni per Windows.

Durante l'esecuzione di un'operazione di trascinamento è possibile gestire l'evento QueryContinueDrag che richiede al sistema l'autorizzazione a proseguire l'operazione di trascinamento. Quando si gestisce questo metodo è inoltre opportuno chiamare i metodi che avranno effetto sull'operazione di trascinamento, ad esempio ampliando un controllo TreeNode in un controllo TreeView quando il cursore si sposta sopra di esso.

Rilascio dei dati

Una volta iniziato il trascinamento dei dati da una posizione in un Windows Form o da un controllo, è possibile rilasciare i dati nel punto desiderato. Il puntatore assume un aspetto diverso quando viene spostato su un'area di un form o su un controllo appropriatamente configurato per il rilascio dei dati. È possibile utilizzare qualsiasi area all'interno di un Windows Form o qualsiasi controllo per il rilascio di dati impostando la proprietà AllowDrop e gestendo gli eventi DragEnter e DragDrop.

Per rilasciare i dati

  1. Impostare la proprietà AllowDrop su true.

  2. Nell'evento DragEnter per il controllo in cui rilasciare i dati, assicurarsi che il tipo dei dati trascinati sia accettabile (in questo caso, Text). Nel codice, l'effetto associato al rilascio verrà quindi impostato su un valore dell'enumerazione DragDropEffects. Per ulteriori informazioni, vedere 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);
    }
    

    Nota

    È possibile definire una classe DataFormats personalizzata specificando un oggetto personalizzato come parametro Object del metodo SetData. Durante questa operazione, assicurarsi sempre che l'oggetto specificato sia serializzabile. Per ulteriori informazioni, vedere Interfaccia ISerializable.

  3. Nell'evento DragDrop per il controllo sul quale si intendono rilasciare gli elementi selezionati, utilizzare il metodo GetData per recuperare i dati trascinati. Per ulteriori informazioni, vedere: Proprietà DtaObject.Data.

    Nell'esempio che segue il controllo sul quale vengono trascinati gli elementi è TextBox. Nel codice, la proprietà Text del controllo TextBox viene impostata su un valore equivalente ai dati trascinati.

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

    Nota

    È inoltre possibile utilizzare la proprietà KeyState in modo che, in base ai tasti premuti durante l'operazione di trascinamento, si verifichi un determinato effetto. Ad esempio, è consuetudine eseguire una copia dei dati trascinati quando viene premuto il tasto CTRL.

Vedere anche

Attività

Procedura: aggiungere dati agli Appunti

Procedura: recuperare dati dagli Appunti

Altre risorse

Supporto delle operazioni di trascinamento e degli Appunti