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 回答