2013-05-04 152 views
-2

我使用下面的代码将文件拖放到c#winforms应用程序中。我遇到的问题是DragDrop事件处理程序需要一段时间,在此期间我无法使用拖动文件的窗口。这怎么解决?拖放问题

private void FormMain_DragDrop(object sender, DragEventArgs e) 
{ 
    string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false); 
    // do some long operation 
} 

private void FormMain_DragEnter(object sender, DragEventArgs e) 
{ 
if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    e.Effect = DragDropEffects.All; 
else 
    e.Effect = DragDropEffects.None; 
} 
+0

只需拖放问题并使用按钮的Click事件运行“长时间操作”即可。这个问题已经被很多次问过了。 – 2013-05-04 11:37:45

+0

@HansPassant你可以给出一些更明确的答案,或者指出我问了很多很多次问题中的一个? – Jerry 2013-05-04 12:07:44

回答

1

你可以使用一个BackgroundWorker这样做,你在不同的线程需要像下面的操作:

BackgroundWorker bgw; 

    public Form1() 
    { 
     InitializeComponent(); 
     bgw = new BackgroundWorker(); 
     bgw.DoWork += bgw_DoWork; 
    } 

    private void Form1_DragDrop(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
     { 
      string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false); 
      bgw.RunWorkerAsync(s); 
     } 

    } 

也为您的问题“跨线程操作”,尝试使用像Invoke方法这样的:

void bgw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     Invoke(new Action<object>((args) => 
     { 
      string[] files = (string[])args; 

     }), e.Argument); 
    } 

其更好地检查,如果掉落的物品是使用GetDataPresent像上述文件。

+0

谢谢,但:1. Action()需要一个参数。 2.如何将bgw_DoWork分配给bgw? – Jerry 2013-05-04 11:55:41

+0

欢迎,请检查我上面的编辑 – 2013-05-04 12:11:42

+0

仍然无法正常工作。你测试过了吗? lambda语句不被执行。 – Jerry 2013-05-04 12:24:55

0

如果这个长时间运行的操作不是用户密集型的,你可以使用后台线程。

ThreadPool.QueueUserWorkItem((o) => /* long running operation*/) 
+0

你会检查你的代码吗? – Jerry 2013-05-04 10:38:48

+0

我得到“跨线程操作无效”异常。这可能是由于在此操作中访问了richtextbox。这可以解决吗? – Jerry 2013-05-04 10:47:20