形式不重绘自己

时间:2009-06-24 09:07:08

标签: c# winforms refresh repaint

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

}

2 个答案:

答案 0 :(得分:4)

看起来您的文件压缩是一个长时间运行的过程,它会阻止表单在压缩完成之前重新绘制。如果您使用BackgroundWorker对象并在后台线程上执行压缩例程,则UI线程将可用于表单以用于绘制。

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

答案 1 :(得分:2)

您可以致电Application.DoEvents()来实现此目标。