2014-10-29 15 views
6

Sto provando a creare un modulo di Windows su cui posso rilasciare un file/cartella.Drag and Drop non funziona in C# Winforms Application

Ho il seguente codice in un app WinForms

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_DragEnter(object sender, DragEventArgs e) 
    { 
     Debug.Print("DragEnter"); 
    } 

    private void Form1_DragDrop(object sender, DragEventArgs e) 
    { 
     MessageBox.Show("Dropped!"); 
    } 
} 

ho impostato la proprietà AllowDrop su true. Ho provato a eseguire l'applicazione in debug in Visual Studio. In base alle risposte ad altre domande simili, ho provato a eseguire l'exe compilato come amministratore. Ho provato a eseguire l'exe compilato non come amministratore.

Ma qualunque cosa faccia, non riesco a far scattare l'evento DragDrop. L'evento DragEnter fa invece il fuoco. Cosa mi manca?

+0

Hai controllato se hai perso accidentalmente la connessione tra l'evento DragDrop e il gestore Form1_DragDrop? Scusa, se l'hai fatto. – Fratyx

+0

È un modulo semplice o hai aggiunto controlli? Se si rilascia il controllo di un modulo, sarà il controllo responsabile. – DonBoitnott

+0

Drag and Drop non funzionerà se si sta eseguendo Visual Studio/l'applicazione come amministratore e Windows Explorer è in esecuzione con il proprio account normale. – Archlight

risposta

15

È il vostro DragDropEffect impostare in modo appropriato? Prova a mettere questo nel DragEnter Event Handler Metodo:

private void Form1_DragEnter(object sender, DragEventArgs e) 
    { 
     Console.WriteLine("DragEnter!"); 
     e.Effect = DragDropEffects.Copy; 
    } 

Di default è stato impostato per DragDropEffects.None quindi l'evento di rilascio non avrebbe sparato.

+0

Esattamente - grazie. – bornfromanegg

+1

Oh mio dio GRAZIE SIR/MADAM! Sono stato alla ricerca di così tanto tempo, e non ho potuto trovare da nessuna parte. – Voidpaw

0

Sono stati scritti gli eventi MouseDown e MouseMove dell'oggetto da cui si sta trascinando.

+0

Non so bene perché questo è stato downvoted. Io uso questo approccio e funziona molto bene. if (e.LeftButton == MouseButtonState.Pressed) { DragDrop.DoDragDrop (this.dragItem, this.dragItem, DragDropEffects.Copy); } E muovendo il mouse, ho semplicemente impostato e.Handled su true, un booleano chiamato sta trascinando per rilevare se l'utente sta ancora spostando l'oggetto quando l'evento si attiva.Ogni area per il rilascio ha il suo evento molto personale per gestire ciò che è stato abbandonato dove. –

1

tenta di utilizzare qualcosa di simile nel tuo Form1_DragEnter:

private void Form1_DragEnter(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     e.Effect = DragDropEffects.All; 
    else 
    { 
     String[] strGetFormats = e.Data.GetFormats(); 
     e.Effect = DragDropEffects.None; 
    } 
} 

questo spara la tua Form1_DragDrop

+0

+1 per il controllo GetDataPresent. Grazie per tutte le risposte. – bornfromanegg

2

Non dimenticare nelle proprietà del modulo per modificare AllowDrop su "True" Probabilmente il tuo codice è corretto, ma se questa proprietà non è abilitata su true non funzionerà. È impostato su false per impostazione predefinita.

+0

AllowDrop era impostato su True. La risposta accettata è quella corretta. – bornfromanegg

0

Un altro problema molto sgradevole e insidioso può essere il superamento dello OnHandleCreated, ma si è dimenticato di chiamare l'implementazione di base. Quindi l'applicazione non riesce a impostare le impostazioni della finestra interna necessarie per rispettare la proprietà AllowDrop.

Ad esempio, assicurati di chiamare base.OnHandleCreated(e) nella tua sostituzione, e starai bene.

0

Avevo anche questo problema sconcertante nonostante la forma con AllowDrop impostato su true!

Nella mia app Windows Form (VS2017) ho dovuto accertarmi di aver impostato un oggetto Startup valido: ad esempio myprojectname.Program e tutto andava bene!