2013-05-04 167 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