Ole*_*e M 5 c# sql-server wpf foreach loops
所以,
\n在我的 WPF 应用程序中,我希望我的用户能够打开发票预览,以便他们可以验证或丢弃它们。DataGridCheckBoxColumn我让他们检查我的a 中的行(每一行代表一张发票)DataGrid,然后单击一个按钮(运行我的CreateInvoicePreview()方法,请参阅帖子底部),让所有发票预览在新窗口中打开(每个发票一个窗口)发票)。
嗯.. 现在发生的事情是:用户检查 InvoiceA 和 InvoiceB。开具了两张发票,但它们是相同的:InvoiceC。始终会开立正确数量的发票,但不会开立正确的实例。如果我打开文件路径中指定的临时文件夹,我会看到数据网格中的所有发票均已保存:InvoiceA 到 InvoiceJ。
\n让我带您浏览一下代码。
\n这是创建并保存实际 PDF 的方法,WebView2控件将其用作源,以便可以在应用程序中显示它们。它被大量缩写。\n我保留了嵌套的结构,foreach loops以防相关。
public void CreatePreviewInvoice() {\n\n /* SQL SERVER CODE\n * SQL SERVER CODE\n * SQL SERVER CODE */\n\n List<PaidTrip> paidTrips = PaidTrips.ToList();\n\n tripsGroupedByCompany = paidTrips.GroupBy(pt => pt.LicenseHolderID);\n\n foreach (IGrouping<string, PaidTrip> companyGroup in tripsGroupedByCompany) {\n\n /* SQL SERVER CODE\n * SQL SERVER CODE\n * SQL SERVER CODE */\n\n List<LicenseHolder> licenseHolders = LicenseHolders.ToList();\n\n IEnumerable<IGrouping<string, PaidTrip>> groupedByVehicle = companyGroup.GroupBy(n => n.VehicleID);\n\n foreach (IGrouping<string, PaidTrip> vehicleGroup in groupedByVehicle) {\n\n // Iterating over all data pertaining to each vehicle\n foreach (PaidTrip trip in vehicleGroup) {\n\n }\n\n try {\n\n string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.Split('\\\\')[1];\n string fileName = $"FORH\xc3\x85NDSVISNING - M\xc3\x85 IKKE SENDES! {LicenseHolderID + "_" + "Faktura_" + InvoiceID}.pdf";\n string filePath = $@"C:\\Users\\{userName}\\AppData\\Local\\Temp\\";\n\n PdfFilePath = $"{filePath}{fileName}";\n\n //if (LicenseHolderID == PreviewInvoiceViewModel.SelectedRow.LicenseHolderID) {\n\n document.Save($"{PdfFilePath}");\n\n //} else {\n\n // return;\n //} \n\n } catch (Exception ex) {\n\n MessageBox.Show(ex.Message);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n正如您所看到的,在方法的最后,我注释掉了一些代码,这是我试图实现一种仅基于检查的行进行过滤的方法。它不起作用。
\n这是以下的 XAML WebView2:
<Wpf:WebView2 \n x:Name="wv_preview_invoice" Loaded="{s:Action CreatePreviewInvoice}" \n Height="997" Width="702" Canvas.Left="20" Canvas.Top="71" \n Source="{Binding PdfFilePath}"></Wpf:WebView2>\nRun Code Online (Sandbox Code Playgroud)\nPdfFilePath是一个属性,在上面的方法中引用。\n它在方法中被赋予一个值,并且当调用Source(for WebView2) 时,它能够从 获取值PdfFilePath,从而显示 PDF。
但正如我最初所说,它只是创建同一张发票的 X 个实例/窗口。始终相同,因为从数据库中查询它们的顺序不同。
\n最后,这是当他们单击要预览的发票时运行的方法,它是使用控件打开新窗口WebView2:
public void PreviewInvoices() {\n\n bool success = false;\n\n foreach (PaidTrip item in PaidTrips) {\n\n if (item.IsChecked == true) {\n\n ShowPreviewInvoiceDetailed(item);\n success = true;\n }\n }\n\n if (!success) {\n\n MessageBox.Show("You must chose an invoice to preview first.");\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n打开下一个窗口的方法WebView2如下所示:
public void ShowPreviewInvoiceDetailed() {\n\n PreviewInvoiceDetailedViewModel viewModel = new(windowManager);\n windowManager.ShowWindow(viewModel);\n}\nRun Code Online (Sandbox Code Playgroud)\n我缺少图片的哪一部分(或几部分)?
\n我通过执行以下操作成功解决了这个问题:
我创造了财产;在父窗口的public static string PreviewedInvoice { get; set; }中。ViewModel在我打开子窗口(要显示预览发票的位置)的方法中,我将其绑定到LicenseHolderID具有 check CheckBox、 via的行foreach loop,如下所示:
public void PreviewInvoices() {
bool success = false;
foreach (PaidTrip item in PaidTrips) {
if (item.IsChecked == true) {
PreviewedInvoice = item.LicenseHolderID;
ShowPreviewInvoiceDetailed();
success = true;
}
}
if (!success) {
MessageBox.Show("You must chose an invoice to preview first.");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,现在我有一种方法可以仅过滤已检查的行,并确保仅实际保存LicenseHolderID与已检查的行中的行相匹配的CheckBox行。我更新了我的主要方法:
if (LicenseHolderID == PreviewInvoiceViewModel.PreviewedInvoice) {
document.Save($"{fullPath}");
SourcePath = fullPath;
}
Run Code Online (Sandbox Code Playgroud)
我绑定到XAML 中SourcePath的源。WebView2
我觉得这是一种笨拙的方式,而且我在各层之间来回切换,正如评论(已删除)所提到的那样。
如果有人能告诉我更好的方法,我会洗耳恭听。