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();

}

[編集:解決済み]

ファイア アンド フォーゲット アプローチを使用する:

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();
    }

}
4

2 に答える 2

4

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

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

于 2009-06-24T09:12:04.320 に答える
1

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

于 2009-06-24T09:17:58.117 に答える