2009-06-24 74 views
0

我該如何讓FileOpenDialog消失?表單不重繪本身

private void ofdAttachment_FileOk(object sender, CancelEventArgs e) 
{    

    string fullFilename = ofdAttachment.FileName; 
    string filename = Path.GetFileName(fullFilename); 
    string dirName = Path.GetDirectoryName(fullFilename); 


    this.Parent.Refresh(); 
    this.Refresh(); 


    var drv = bdsAttachments.AddNew() as DataRowView; 


    var fze = new FastZipEvents(); 
    fze.ProgressInterval = new TimeSpan(0, 0, 0, 0, 250); 
    fze.Progress = new ICSharpCode.SharpZipLib.Core.ProgressHandler(
    (object o, ICSharpCode.SharpZipLib.Core.ProgressEventArgs ex) => 
    {      
     drv["filename"] = "Compressing: " 
      + ex.PercentComplete.ToString() + "%"; 
     grdAttachments.Refresh(); 
     this.Refresh(); // this doesn't work either      
     Application.DoEvents(); // re: Aamir's answer, neither work 
     this.Refresh(); 

    } 
    ); 



    var ba = new FastZip(fze).CreateZipToArray(dirName, false, filename, null); 

    drv["filename"] = filename; 
    drv["file_zip_image"] = ba; 

    grdAttachments.Refresh(); 

} 

[編輯:解決]

使用fire-and-forget approach

private void ofdAttachment_FileOk(object sender, CancelEventArgs e) 
{    
    System.Threading.ThreadPool.QueueUserWorkItem((o) => Attach()); 
} 

void Attach() 
{ 

    if (this.InvokeRequired) 
    { 
     this.Invoke(new Action(Attach));  
    } 
    else 
    { 

     this.Parent.Refresh(); 
     this.Refresh(); 

     string fullFilename = ofdAttachment.FileName; 
     string filename = Path.GetFileName(fullFilename); 
     string dirName = Path.GetDirectoryName(fullFilename); 



     var drv = bdsAttachments.AddNew() as DataRowView; 


     var fze = new FastZipEvents(); 
     fze.ProgressInterval = new TimeSpan(0, 0, 0, 0, 250); 
     fze.Progress = new ICSharpCode.SharpZipLib.Core.ProgressHandler(
      (object o, ICSharpCode.SharpZipLib.Core.ProgressEventArgs ex) => 
      { 
      drv["filename"] = "Compressing: " 
       + ex.PercentComplete.ToString() + "%"; 
      grdAttachments.Refresh();       
      } 
     ); 



     var ba = new FastZip(fze).CreateZipToArray(dirName, false, 
        filename, null); 

     drv["filename"] = filename; 
     drv["file_zip_image"] = ba; 

     grdAttachments.Refresh(); 
    } 

} 
+0

你能更具體地瞭解你想要做什麼嗎? – ChrisF 2009-06-24 09:09:52

+0

該程序應該使fileopendialog的框消失,這有點業餘 - 尋找當進度條正在更新自己時是否仍然在屏幕上的filedialog框 – Hao 2009-06-24 09:15:52

回答

4

它看起來像你的文件壓縮是一個長期運行的進程,防止形式重畫,直到壓縮完成。如果您使用BackgroundWorker對象並在後臺線程上執行壓縮例程,則UI線程將可用於表單以供繪製。

BackgroundWorker的信息:http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

+1

也有辦法從工作線程發佈進度狀態 – ChrisF 2009-06-24 09:13:37

2

您可以撥打Application.DoEvents()實現這一目標。