2016-11-20 2 views
0

Ich benutze WinForms. In meinem Formular habe ich einen Button, der alle TIF-Bilder in einem Verzeichnis ausdruckt. Ich möchte meiner Anwendung mitteilen, dass die Bilder freigegeben werden sollen, wenn der Druckauftrag abgebrochen wird oder der Druckvorgang beendet ist. Ich denke, dass FileInfo hier wohl das Problem ist. Wie kann ich diese Aufgabe erfüllen?Geben Sie die Datei frei, wenn die Anwendung fertig ist.

List<string> DocPathList = new List<string>(); 
    private int page; 

    private void btn_Print_Click(object sender, EventArgs e) 
    { 
     DirectoryInfo SourceDirectory = new DirectoryInfo(@"C:\image\Shared_Directory\Printing_Folder\"); 
     FileInfo[] Files = SourceDirectory.GetFiles("*.tif"); //Getting Tif files 


     foreach (FileInfo file in Files) 
     { 
      DocPathList.Add(SourceDirectory + file.Name); 
     } 

     printPreviewDialog1.Document = printDocument1; 
     printPreviewDialog1.Show(); 
    } 

    private void printDocument1_PrintPage(object sender, PrintPageEventArgs e) 
    { 
      e.Graphics.DrawImage(Image.FromFile(DocPathList[page]), e.MarginBounds); 
      page++; 
      e.HasMorePages = page < DocPathList.Count; 
    } 

    private void printDocument1_BeginPrint(object sender, PrintEventArgs e) 
    { 
     page = 0; 
    } 

Wenn ich diese Codezeile hinzufügen, wird das Image freigegeben. Es funktioniert, wenn ich einmal auf den Button klicke. wenn ich jedoch die Drucktaste zum zweiten Mal printPreviewDialog1.Show(); drücken wollen wirft einen Fehler:

Exception thrown: 'System.ObjectDisposedException' in System.Windows.Forms.dll

 using (var image = Image.FromFile(DocPathList[page])) 
     { 
      e.Graphics.DrawImage(image, e.MarginBounds); 
      page++; 
      e.HasMorePages = page < DocPathList.Count; 
     } 

Zum Beispiel, wenn ich meinen Druck abbrechen und dann gehen Sie zu Datei erforschen löschen/umbenennen/ändern diese Datei Ich den Fehler unten. Derzeit muss ich meine Anwendung schließen, dann kann ich die TIF-Dokumente ändern.

enter image description here

Antwort

1

In jedem Fall müssen Sie Ihre image in einem using Block wickeln, wie Sie in Ihrem bearbeiten beschrieben, da Image.FromFile() werden keep a lock on the file until the image is disposed.

Die ObjectDisposedException Sie sehen, kommt aus der printPreviewDialog, nicht mit dem Laden von Bildern. Sie können entweder ...

(a) verwenden printPreviewDialog1.ShowDialog(this) stattdessen einen Dialog modal zu zeigen (dh Block Eingabe in dem übergeordneten Fenster, während der Dialog geöffnet ist), die den Dialog nicht entsorgt werden, nachdem es

Schließen

oder, (b) verwenden printPreviewDialog.Show(this) den Dialog nicht-modal zu zeigen, wie Sie jetzt tun, aber den folgenden Rückruf hinzu:

private void printPreviewDialog1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     // Don't close and dispose the form if the user is just dismissing it. Hide instead. 
     if (e.CloseReason == CloseReason.UserClosing) 
     { 
      e.Cancel = true; 
      printPreviewDialog1.Hide(); 
     } 
    } 
0

Abonnieren Sie den EndPrint Event und die Datei dort löschen?

Aus der Dokumentation:

EndPrint event also occurs if the printing process is canceled or an exception occurs during the printing process.

+0

ich könnte nicht klar gewesen sein, ich mag die Anwendung nur sagen, dass ich don Ich möchte diese Dokumente nicht mehr verwenden, also mache ich diesen Windows-Fehler nicht: Die Aktion kann nicht abgeschlossen werden, da die Datei in einer anderen Anwendung geöffnet ist. – taji01

Verwandte Themen