Форма не перекрашивается сама - PullRequest
0 голосов
/ 24 июня 2009

Как я могу заставить 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();
    }

}

Ответы [ 2 ]

4 голосов
/ 24 июня 2009

Похоже, что сжатие вашего файла - это длительный процесс, который не позволяет перерисовать форму до тех пор, пока сжатие не завершится. Если вы используете объект BackgroundWorker и выполняете процедуру сжатия в фоновом потоке, поток пользовательского интерфейса будет доступен для формы, используемой для рисования.

Информация BackgroundWorker: http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

2 голосов
/ 24 июня 2009

Вы можете позвонить Application.DoEvents() для достижения этой цели.

...