我有2个问题 一:我有一个报告编号(元素)列表和文件路径(_filePath)现在,当我使用Directory.GetFiles()时根据下面的代码过滤基于元素列表没有返回任何内容,所以过滤这种方式可能有问题,好好纠正它。 二:请在foreach循环中定义打印代码
// 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
}
}
答案 0 :(得分: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个对话框来确定所有设置是非常不寻常的,因为每个文档都应该有自己的对话框(它们可能有不同的页数等)。
编辑(您实际上需要使用Process处理打印的完整路径名称):
基本上使用OLD代码(来自您的问题,在看到上述内容后没有编辑),而是使用它代替:
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( );
}
这可以确保您使用文件的FULL路径作为FileName,因此它不会说该文件已经损坏了#34;。
最后,您希望能够选择/更改打印机名称,方法如下:
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( );
}
}