2009-06-24 17 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(); 

} 

[EDIT:解決]

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

+0

プログレスバーがそれ自身を更新している間に、filedialogボックスが画面上にまだ残っていれば、ファイルプレンティアログのボックスが消えるようにする必要があります。 – Hao

答えて

4

ファイル圧縮は圧縮が完了するまで再描画からフォームを防ぎ、長時間実行されるプロセスであるように見えます。 BackgroundWorkerオブジェクトを使用し、バックグラウンドスレッドで圧縮ルーチンを実行すると、フォームでペイントに使用するためのUIスレッドが使用可能になります。

BackgroundWorkerの情報:http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

+1

ワーカースレッドから進捗状況を投稿する方法もあります – ChrisF

2

あなたはこれを達成するためにApplication.DoEvents()を呼び出すことができます。

+2

いいえいいえいいえいいえいいえいいえ。これは後で戻ってくることができ、後で変な方法でお尻にあなたをかむことができる解決策の1つです。ただしないでください。それは間違いなくペイントを消火し、それができる他のイベントも発射します。それは違和感を引き起こす。 – aehiilrs

関連する問題