2009-06-24 7 views
0

Wie kann ich den FileOpenDialog verschwinden lassen?Formular nicht neu selbst erstellen

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: Gelöst]

mit dem 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

Können Sie etwas genauer sein, was Sie zu tun versuchen? – ChrisF

+0

Das Programm sollte die Dateiopendialogs-Box verschwinden lassen, es ist ein wenig amateurhaft, wenn das Feld "filialialog" noch auf dem Bildschirm ist, während sich der Fortschrittsbalken selbst aktualisiert – Hao

Antwort

4

Es ist wie Ihre Datei-Komprimierung aussieht, ist ein lange laufender Prozess, der von Neuanstrich der Form verhindert, bis die Kompression beendet hat. Wenn Sie ein BackgroundWorker-Objekt verwenden und die Komprimierungsroutine für einen Hintergrundthread ausführen, ist der UI-Thread für das zu verwendende Formular verfügbar.

Backgroundinfo: http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

+1

Es gibt Möglichkeiten, den Fortschrittsstatus vom Worker-Thread zu posten – ChrisF

2

Sie können Application.DoEvents() nennen dies zu erreichen.

+2

Nein Nein nein Nein nein Nein Nein. Dies ist eine dieser Lösungen, die später auf seltsame Weise in den Arsch beißen können. Tu es einfach nicht. Es wird definitiv Paint auslösen, und auch jedes andere Ereignis, das es kann. Das verursacht Fremdheit. – aehiilrs

Verwandte Themen