2016-11-20 98 views
0

我正在使用WinForms。在我的表單中,我有一個按鈕可以打印目錄中的所有tif圖像。如果打印作業被取消或打印完成,我想告訴我的應用程序釋放圖像。我認爲FileInfo可能是這裏的問題。我怎樣才能完成這項任務?當使用它完成應用程序時釋放該文件

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; 
    } 

如果我添加這行代碼它釋放圖像。它工作,如果我點擊一次按鈕。但是,如果我想按下打印按鈕第二次printPreviewDialog1.Show();拋出一個錯誤:

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; 
     } 

例如,如果我取消打印,然後轉到文件瀏覽,刪除/重命名/修改這個文件我下面的錯誤。 目前我必須關閉我的應用程序,然後我可以修改tif文件。

enter image description here

回答

1

在任何情況下,你需要像你在你的編輯說明來包裝你imageusing塊,因爲Image.FromFile()keep a lock on the file until the image is disposed

您看到的ObjectDisposedException來自printPreviewDialog,與加載圖像無關。您可以...

(一)使用printPreviewDialog1.ShowDialog(this)而不是要顯示一個對話框,模態(即,塊輸入,而對話框打開父窗口),關閉它

後,不會處置該對話框

或(b)使用printPreviewDialog.Show(this)來顯示對話框非模態,像你現在這樣做,但添加下面的回調:

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

訂閱EndPrint Event和刪除文件呢?

從文檔:

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

+0

我可能沒有明確,我只想告訴應用程序,我不不想再使用這些文檔,所以我不會這個Windows錯誤:行動不能完成,因爲該文件在另一個應用程序中打開。 – taji01

相關問題