根据 CheckBoxColumn 中的选择在 WebView2 中打开 PDF

Ole*_*e M 5 c# sql-server wpf foreach loops

所以,

\n

在我的 WPF 应用程序中,我希望我的用户能够打开发票预览,以便他们可以验证或丢弃它们。DataGridCheckBoxColumn我让他们检查我的a 中的行(每一行代表一张发票)DataGrid,然后单击一个按钮(运行我的CreateInvoicePreview()方法,请参阅帖子底部),让所有发票预览在新窗口中打开(每个发票一个窗口)发票)。

\n

嗯.. 现在发生的事情是:用户检查 InvoiceA 和 InvoiceB。开具了两张发票,但它们是相同的:InvoiceC。始终会开立正确数量的发票,但不会开立正确的实例。如果我打开文件路径中指定的临时文件夹,我会看到数据网格中的所有发票均已保存:InvoiceA 到 InvoiceJ。

\n

让我带您浏览一下代码。

\n

这是创建并保存实际 PDF 的方法,WebView2控件将其用作源,以便可以在应用程序中显示它们。它被大量缩写。\n我保留了嵌套的结构,foreach loops以防相关。

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,在方法的最后,我注释掉了一些代码,这是我试图实现一种仅基于检查的行进行过滤的方法。它不起作用。

\n

这是以下的 XAML WebView2

\n
<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>\n
Run Code Online (Sandbox Code Playgroud)\n

PdfFilePath是一个属性,在上面的方法中引用。\n它在方法中被赋予一个值,并且当调用Source(for WebView2) 时,它能够从 获取值PdfFilePath,从而显示 PDF。

\n

但正如我最初所说,它只是创建同一张发票的 X 个实例/窗口。始终相同,因为从数据库中查询它们的顺序不同。

\n

最后,这是当他们单击要预览的发票时运行的方法,它是使用控件打开新窗口WebView2

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

打开下一个窗口的方法WebView2如下所示:

\n
 public void ShowPreviewInvoiceDetailed() {\n\n    PreviewInvoiceDetailedViewModel viewModel = new(windowManager);\n    windowManager.ShowWindow(viewModel);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我缺少图片的哪一部分(或几部分)?

\n

Ole*_*e M 4

我通过执行以下操作成功解决了这个问题:

我创造了财产;在父窗口的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

我觉得这是一种笨拙的方式,而且我在各层之间来回切换,正如评论(已删除)所提到的那样。

如果有人能告诉我更好的方法,我会洗耳恭听。