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