2017-06-15 204 views
0

我有2個問題 其中之一:我現在使用Directory.GetFiles()按照以下代碼列出報告編號(元素)和文件路徑(_filePath)基於元素列表過濾沒有任何返回,所以可能是這種方式過濾出錯,所以請更正。 二:請定義foreach循環打印代碼從文件夾中選擇並打印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()返回路徑的完整文件名,你可能想將其與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

謝謝你這是工作。對於問題的第二部分,我想將選定的報告打印到打印機,只顯示一次打印對話框以設置打印選項。請儘可能幫助 – Hussein

+0

@侯賽因我可以嘗試鞭打一些東西,我應該把它添加到這個答案,或者你正在創建一個新的問題? –

+0

如果可能,請將其添加到此答案中,因爲它是問題的第二部分。在此先感謝 – Hussein