2016-11-20 3 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

、あなたがあなたの編集で説明したようにImage.FromFile()意志keep a lock on the file until the image is disposedいるので、あなたのimageusingブロックでラップする必要があります。

ObjectDisposedExceptionあなたが見ているのはprintPreviewDialogです。画像の読み込みとは関係ありません。あなたはどちらか...

(A)は

それを閉じた後、ダイアログを配置しませんダイアログモーダル(すなわち、親ウィンドウへのブロックの入力ダイアログが開いている間)を表示する代わりに 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

を、私はちょうど私ドンアプリケーションをお伝えしたいと思いますこれらのドキュメントをもう使用したくないので、このウィンドウエラーはありません。ファイルが別のアプリケーションで開いているため、アクションは完了できません。 – taji01

関連する問題