2009-06-24 53 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()实现这一目标。