2017-06-15 13 views
0

私は2つの問題があります 1:以下のコードでDirectory.GetFiles()を使用するとレポート番号(要素)とファイルパス(_filePath)のリストが表示されます要素リストに基づいてフィルタリングされたものは何も返されないので、このようにフィルタリングすることで何か問題が生じる可能性があります。 2:パスとの完全なファイル名を返します。)(、フォルダからPDFファイルのリストを選択して印刷する

// Print the selected files. 
    private void PrintReports(Item _itemNo) 
    { 
     //GetNDEReportDirectory() return directory based on _itemNo 
     string _filePath = GetNDEReportDirectory(_itemNo); 
     List<string> elements = new List<string>(); 
     //GetNDEReportsList() return a list of required reports numbers 
     elements = GetNDEReportsList(_itemNo); 

     //option-2 
     var files = Directory.GetFiles(_filePath).Where(f => 
         elements.Contains(f)).ToList(); 


     foreach (var file in files) 
     { 
      //print code 

     } 

    } 

答えて

1

まずDirectory.GetFilesをforeachループでの印刷コードを定義してください、あなたが取得するSystem.IO.Path.GetFileName()とそれを組み合わせるすることもできますファイル名のみ。

List<string> fileNames = Directory.GetFiles(_filePath).Select(d => Path.GetFileName(d)).ToList(); 

その後、GetNDEReportsList(_itemNo); (パスまたはファイル名だけ?との完全なファイル名)によって返されたものに応じて、既存のコードを使用することができます。印刷コードについては

var files = fileNames.Where(f => elements.Contains(f)).ToList(); 

、あなたは印刷を支援するためにサードパーティ製のソフトウェアが必要になりますので、それは、のように容易ではなく、各ドキュメントは独自のを持っていなければならないので、すべての設定を決定するために、1つのダイアログのあなたの条件は非常に珍しいですダイアログ(ページ数などが異なる場合があります)。

EDIT(あなたが実際にプロセス使用して動作するように、印刷用の完全なパス名を必要とする):(上記見た後、編集せずに、あなたの質問から)

は基本的に古いコードを使用して、代わりにこれを使用する:

var files = Directory.GetFiles(_filePath).Where(f => elements.Contains(Path.GetFileName(f))).ToList(); 

そして、あなたのforeachの中で、試してみてください。

foreach (var file in files) 
{ 
    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo() 
    { 
     CreateNoWindow = true, 
     Verb = "print", 
     FileName = file 
    }; 
    p.Start(); 
} 

これは、ファイル名、ファイルの完全なパスを使用し確実に、そしてそれは、ファイルが「破損し」ていると言うことはありません。

最後に、あなたが/変更プリンタ名を選択することができるようにしたい、ここではどのようにある:

System.Windows.Forms.PrintDialog pDlg = new System.Windows.Forms.PrintDialog(); 
pDlg.AllowSomePages = false; 
pDlg.ShowHelp = false; 
DialogResult result = pDlg.ShowDialog(); 

// If the result is OK then continue. 
if (result == DialogResult.OK) 
{ 
    //print your documents here 
    foreach (var file in files) 
{ 
    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo() 
    { 
     CreateNoWindow = true, 
     Verb = "print", 
     FileName = file, 
     Arguments = pDlg.PrinterName 
     WindowStyle = ProcessWindowStyle.Hidden  //optional, if you can't hide the adobe window properly with CreateNoWindow 
    }; 
    p.Start(); 
} 
} 
+0

は、それが働いているあなたに感謝。質問のパート2では、選択したレポートをプリンタに印刷し、印刷ダイアログボックスを1回だけ表示して印刷オプションを設定します。可能であれば親切に助けてください – Hussein

+0

@フセイン私は何かを鞭打ちしようとすることができます、私はこの答えにそれを加えるか、それとも新しい質問を作成していますか? –

+0

可能であれば、質問の第2部分であるため、この回答に追加してください。ありがとうございます。 – Hussein

関連する問題