賞金將在 6 天后到期。此問題的答案有資格獲得 250聲望賞金。 Ole M正在尋找這個問題的更詳細的答案。
所以,
在我的 WPF 應用程式中,我希望我的用戶能夠打開發票的預覽,以便他們可以驗證或丟棄它們。我讓他們檢查我的 aDataGridCheckBoxColumn中的行(每一行代表一張發票) DataGrid,然后單擊一個按鈕(運行我的CreateInvoicePreview()方法,見帖子底部),在新視窗中打開所有發票預覽(每個視窗一個視窗發票)。
嗯.. 現在發生的事情是:用戶檢查 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);
}
}
}
如您所見,在該方法的最后,我注釋掉了一些代碼,這是我試圖實作一種僅基于檢查的行進行過濾的方法。這沒用。
這是 XAML 的WebView2:
<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在之后被呼叫,因此它使用 PDF 保存到的地址來填充WebView2.
但正如我最初所說,它只是創建同一張發票的 X 數量的實體/視窗。我猜它是根據如何從資料庫中查詢資料來決定的。
我不知道它是否相關,但這里也是我stored procedure的:
/****** Object: View [dbo].[v_trips_preview] Script Date: 14.01.2022 14:56:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER VIEW [dbo].[v_trips_preview]
WITH SCHEMABINDING
AS
SELECT DISTINCT
[L?yvehaverID] as LicenseHolderID,
[Kj?ret?yID] as VehicleID,
SUM([c]) as CountTrips,
MAX(SUBSTRING([?r], 7, 4)) as ThisYear,
MAX(SUBSTRING([M?ned], 4, 2)) as ThisMonth,
SUM([Betaling (brutto)]) as PaymentGross,
SUM([Betaling (netto)]) as PaymentNet,
MAX(CONCAT(L?yvehaverFakturaID,
'UF-' SUBSTRING([?r], 9, 2)
SUBSTRING([M?ned], 4, 2))) as LicenseHolderInvoiceID,
[RowIsChecked] as IsChecked
FROM [dbo].[trips_non_aggregate]
GROUP BY [L?yvehaverID], [RowIsChecked], [Kj?ret?yID]
ORDER BY [PaymentGross]
OFFSET 0 ROWS
GO
最后,這是當他們單擊要預覽的任何發票時運行的方法,即使用WebView2控制元件打開新視窗:
public void CreateInvoicePreview() {
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是:
public void ShowPreviewInvoiceDetailed(PaidTrip item) {
PreviewInvoiceDetailedViewModel viewModel = new(windowManager);
windowManager.ShowWindow(viewModel);
}
我缺少圖片的哪一部分(或幾部分)?
uj5u.com熱心網友回復:
我設法通過執行以下操作解決了這個問題:
我做了一個財產;public static string PreviewedInvoice { get; set; }在ViewModel父視窗中。我在方法中參考了它VerifyInvoices(),如下所示:
foreach (PaidTrip item in PaidTrips) {
if (item.IsChecked == true) {
PreviewedInvoice = item.LicenseHolderID;
ShowPreviewInvoiceDetailed();
success = true;
然后if statement我在孩子的主要方法中添加了一個ViewModel:,我還重新安排了檔案路徑的屬性。
if (LicenseHolderID == PreviewInvoiceViewModel.PreviewedInvoice) {
document.Save($"{fullPath}");
SourcePath = fullPath;
}
我系結到XAML 中SourcePath的源。WebView2
我覺得這是一種笨拙的做法,正如評論(已洗掉)提到的那樣,我在層之間來回走動。
如果有人能告訴我更好的方法,我全神貫注..
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/413841.html
標籤:
