2010-01-16 8 views
6

Il metodo viene eseguito due volte di seguito e non vi è alcun motivo apparente per farlo. Succede in VS2010 Express (4.0) e in VS2008 (3.5).C# ListView DragDrop Event Method Executing Twice Per Drop

public GUI() 
{ 
    InitializeComponent(); 
    this.lvwFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.lvwFiles_DragDrop); 
    this.lvwFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.lvwFiles_DragEnter); 
} 
private void lvwFilesAdd(string path, string[] paths) 
{ ... } 
private void lvwFilesWrite() 
{ ... } 
private void lvwFiles_DragEnter(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     e.Effect = DragDropEffects.Copy; 
    else 
     e.Effect = DragDropEffects.None; 
} 
private void lvwFiles_DragDrop(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
     var paths = (string[])e.Data.GetData(DataFormats.FileDrop); 
     var path = Path.GetDirectoryName(paths[0]); 
     lvwFilesAdd(path, paths); 
     lvwFilesWrite(); 
    } 
} 
+3

Sei sicuro che 'InitializeComponent()' non sta installando un gestore di dragdrop? –

+1

Solo per echeggiare il commento di J. Knoeller sopra: aprire il file Designer.cs e verificare la presenza di ulteriori gestori DragEnter e DragDrop. – BillW

+0

Ok, capito, grazie! – OIO

risposta

4

Stavo seguendo Microsoft esempio e non si accorse che le dichiarazioni in GUI.Designer.cs (automatici, da IDE) e in GUI.cs (manuale, da esempio) sono ridondanti.

=== GUI.cs === 
public GUI() 
{ 
    InitializeComponent(); 
    this.lvwFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.lvwFiles_DragDrop); 
    this.lvwFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.lvwFiles_DragEnter); 
} 

=== GUI.Designer.cs === 
// 
// lvwFiles 
// 
... 
this.lvwFiles.DragDrop += new System.Windows.Forms.DragEventHandler(this.lvwFiles_DragDrop); 
this.lvwFiles.DragEnter += new System.Windows.Forms.DragEventHandler(this.lvwFiles_DragEnter);