在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
.NET框架軟件開發代表了由微軟支持的強大且多功能的框架,使 .NET 開發人員能夠創建跨多個平台、操作系統和設備的高質量應用程式。 這個軟體開發框架旨在提供全面的解決方案,提供開發工具、函式庫和API,讓軟體開發人員能在.NET平台上高效地構建網頁、桌面和移動應用程式。
支援多種程式語言,包括C#、Visual Basic和F#,.NET開發擴展了其靈活性,確保開發人員可以在其首選語言中工作,同時受益於.NET Core生態系統的豐富功能。 在本教程中,我們將看到IronPDF 如何提升 .NET 開發用於解決現實世界的問題。
.NET 生態系統是一個重要的 .NET 實作,它是一個廣泛的綜合平台,包含各種元件和技術,旨在促進跨不同操作系統的應用程式開發。 .NET Framework 和 .NET Core 的核心是運行 .NET 應用程序的主要引擎,提供一個通用語言運行時(公共語言運行庫)管理代碼執行並提供像記憶體管理、類型安全、異常處理等服務。
CLR 是 .NET 架構的一個關鍵元素,使 .NET 程式碼能夠跨不同作業系統執行。 它編譯通用中間語言(通用中間語言 (CIL))轉換為可供主機直接執行的本機機器代碼。 此過程確保 .NET 應用程式能夠在各種平台上無縫運行,從主要的移動操作系統到 Windows 網站伺服器。
.NET Core 作為跨平台框架出現,使 .NET 應用程式能夠在 Linux、macOS 和 Windows 上運行。 這種適應性使 .NET 成為開發人員瞄準跨不同設備和平台達到更廣泛受眾的理想選擇。 使用 .NET Core,應用程式可以在任何支援的作業系統上開發和部署,增強了 .NET 軟體開發的覆蓋範圍和靈活性,並由龐大的 .NET 社群支持。
Visual Studio 脫穎而出,成為首屈一指的集成開發環境。(集成開發環境)適用於 .NET 開發。 它為開發人員提供強大的工具,用於編寫、調試和部署 .NET 應用程式。 Visual Studio 支援多種程式語言,並提供多樣化功能,以建構網頁、桌面和行動應用程式,成為 .NET 開發者不可或缺的工具。
在 .NET 平台上開發應用程式需要利用該框架提供的多種工具、庫和程式語言,例如 Visual Basic,展現其全面的生態系統。 這種多樣性使軟體開發人員能夠構建各種類型的 .NET 應用程式,從網頁和桌面應用程式到基於雲端和行動解決方案。
ASP.NET 是 .NET 框架的重要部分,專為建立動態網頁和應用程式而設計。 它允許開發人員創建可回應且可擴展的網路應用程式,以處理大量流量。 ASP.NET Core 是 ASP.NET 的開源版本,為構建跨平台 web 應用程序帶來了更多功能,使得在 Windows、Linux 和 macOS 上開發和部署 web 應用成為可能。
.NET 提供兩種主要的方法來創建桌面應用程式:Windows Forms 和 Windows 展示基礎結構 (Windows Presentation Foundation)。(WPF). Windows Forms 提供了一種簡單的方法來建立具有豐富圖形使用者介面的桌面應用程式,而 WPF 則使用 XAML。(可扩展应用程序标记语言)以啟用具有先進圖形和動畫的視覺上吸引人的使用者界面開發。
在行動開發方面,.NET 通過 Xamarin 框架將其覆蓋擴展到主要的行動操作系統,現在已整合到 .NET 中作為 .NET MAUI。(跨平台應用程式使用者介面). 這種方法允許開發人員在 iOS、Android 和 Windows 平台上重複使用代碼,簡化了創建具有原生性能和用戶體驗的行動應用程式的過程。
.NET 也非常適合開發在雲端運行的應用程式。 藉由對 Azure 和其他雲平台的支持,開發者可以構建可擴展的分佈式應用程式,充分利用雲端計算資源。 ASP.NET Core 在開發微服務中扮演著重要角色,提供輕量、模組化且可獨立部署的服務,能在雲端環境中擴展。
.NET 生態系統包含 ML.NET,一個機器學習框架,允許開發人員將自訂機器學習模型融入其 .NET 應用程式中。 這項整合開啟了打造智能應用程式的可能性,這些應用程式能夠進行預測分析、自然語言處理等,並利用AI在 .NET 框架下的強大功能。
在生機勃勃的 .NET 軟體開發生態系統中,能夠直接在應用程式內生成、操作和管理 PDF 文件是一項重大優勢。 IronPDF 是為 .NET 開發人員設計的一個強大函式庫,能夠無縫整合至這個環境中,提供從 .NET 應用程式(包括使用 Windows Forms 建立的應用程式)生成 PDF 的高效方法。
IronPDF 是 .NET 生態系統靈活性和強大功能的見證,為開發者提供直觀的 API 來生成 PDF 文件從 HTML、圖片、文本,甚至 ASP.NET 網頁。 此功能在需要動態文件創建的場景中特別有用,比如在桌面應用程式中生成發票、報告或個性化文件。
一個用於生成發票的 Windows Form 應用程序展示了結合 IronPDF 的 .NET 軟體開發的實際應用。 此應用程式允許用戶輸入客戶資訊、購買項目和價格等詳細資料,然後只需一鍵即可生成專業的 PDF 發票。
首先在 Visual Studio 中創建一個新的 Windows Forms 專案。 這是您的基礎,您將在此設計發票生成器的使用者介面。 設計表單以包含客戶和項目詳細資訊所需的輸入欄位,並附上一個按鈕以生成 PDF。 這是我們的發票生成器用戶界面:
Windows Forms 應用程式的使用者介面經過精心設計,以確保易用性和功能性。 主窗口標題為「Invoice Generator」,分為不同區域以實現流暢的使用者體驗。
在頂部,表單包含「客戶名稱」、「客戶地址」、「客戶電子郵件」和「客戶電話號碼」欄位。此區域專門用於收集將在生成的發票上顯著顯示的重要客戶信息。
就在客戶信息下面,有一個標示為「新增發票項目」的區域。在這裡,使用者可以輸入各個項目的詳細資訊,例如「項目 ID」、「描述」、「數量」和「單價」。這些欄位旁邊有一個「新增項目」按鈕,允許使用者將輸入的項目添加到下面的發票列表中。
表單的中心部分是「發票資訊」部分,顯示一個表格,用於顯示新增的輸入項目。 表格欄位包括「項目編號」、「描述」、「數量」、「單價」和「總價」,最後一欄是根據數量和單價自動計算的。一個名為「選擇日期」的日期選擇器允許用戶指定發票日期,增加了文件的特定性。
在表單底部,標籤顯示「總金額」,隨著項目的添加或移除動態更新。 這確保用戶能夠實時統計發票的總價值。 此外,「產生發票」按鈕會提示應用程式使用 IronPDF 函式庫,根據輸入的資料創建發票的 PDF 版本。
這個用戶介面不僅具有功能性,還富有直觀性,使得用戶可以輕鬆地與應用程式互動,而無需陡峭的學習曲線。 它旨在容納生成發票所需的所有信息,同時提供從數據輸入到 PDF 創建的清晰且直接的路徑。
項目設置完成後,下一步就是引入IronPDF。 這是通過 NuGet 完成的,Visual Studio 的集成 NuGet 套件管理器,讓您輕鬆將 IronPDF 添加到您的專案中。 輸入以下命令並運行:
Install-Package IronPdf
此指令將安裝IronPDF,並可在我們的專案中使用。
Windows Forms 應用程式的核心是其處理使用者輸入的能力,將資料組織成結構化格式,並產生成果文件──在此情況下,即是 PDF 格式的發票。 功能是基於應用程式代碼庫中的一系列方法步驟構建的。
初始化表單時,應用程式將呼叫 SetupDataGridViewColumns 以建立顯示發票項目的資料結構。 建立了項目ID、描述、數量、單價和總價的欄位,總價是只讀欄位,因為它會自動計算。 此外,新增了一個用於刪除項目的按鈕列,增強了使用者對發票內容的控制。
private void SetupDataGridViewColumns()
{
invoiceDataGridView.Columns.Clear(); // Clear existing columns if any
// Now add the rest of your columns
invoiceDataGridView.Columns.Add("itemIdColumn", "Item ID");
invoiceDataGridView.Columns.Add("descriptionColumn", "Description");
invoiceDataGridView.Columns.Add("quantityColumn", "Quantity");
invoiceDataGridView.Columns.Add("unitPriceColumn", "Unit Price");
invoiceDataGridView.Columns.Add("totalPriceColumn", "Total Price");
// Set the Total Price column to read-only as it will be calculated automatically
invoiceDataGridView.Columns ["totalPriceColumn"].ReadOnly = true;
// Add a button column for delete action
DataGridViewButtonColumn deleteButtonColumn = new DataGridViewButtonColumn();
deleteButtonColumn.HeaderText = "";
deleteButtonColumn.Name = "deleteButtonColumn";
deleteButtonColumn.Text = "Delete";
deleteButtonColumn.UseColumnTextForButtonValue = true; // This will set the button text to "Delete"
// Add the delete button column to the DataGridView
invoiceDataGridView.Columns.Add(deleteButtonColumn);
}
public Form1()
{
InitializeComponent();
SetupDataGridViewColumns();
// Wire up the CellClick event to a handler
invoiceDataGridView.CellClick += invoiceDataGridView_CellClick;
}
private void invoiceDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
// If the clicked cell is part of the button column and not the header row
if (e.ColumnIndex == invoiceDataGridView.Columns ["deleteButtonColumn"].Index && e.RowIndex >= 0)
{
// Confirm delete operation
if (MessageBox.Show("Are you sure you want to delete this item?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
// Remove the row from the DataGridView
invoiceDataGridView.Rows.RemoveAt(e.RowIndex);
}
}
}
private void SetupDataGridViewColumns()
{
invoiceDataGridView.Columns.Clear(); // Clear existing columns if any
// Now add the rest of your columns
invoiceDataGridView.Columns.Add("itemIdColumn", "Item ID");
invoiceDataGridView.Columns.Add("descriptionColumn", "Description");
invoiceDataGridView.Columns.Add("quantityColumn", "Quantity");
invoiceDataGridView.Columns.Add("unitPriceColumn", "Unit Price");
invoiceDataGridView.Columns.Add("totalPriceColumn", "Total Price");
// Set the Total Price column to read-only as it will be calculated automatically
invoiceDataGridView.Columns ["totalPriceColumn"].ReadOnly = true;
// Add a button column for delete action
DataGridViewButtonColumn deleteButtonColumn = new DataGridViewButtonColumn();
deleteButtonColumn.HeaderText = "";
deleteButtonColumn.Name = "deleteButtonColumn";
deleteButtonColumn.Text = "Delete";
deleteButtonColumn.UseColumnTextForButtonValue = true; // This will set the button text to "Delete"
// Add the delete button column to the DataGridView
invoiceDataGridView.Columns.Add(deleteButtonColumn);
}
public Form1()
{
InitializeComponent();
SetupDataGridViewColumns();
// Wire up the CellClick event to a handler
invoiceDataGridView.CellClick += invoiceDataGridView_CellClick;
}
private void invoiceDataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
// If the clicked cell is part of the button column and not the header row
if (e.ColumnIndex == invoiceDataGridView.Columns ["deleteButtonColumn"].Index && e.RowIndex >= 0)
{
// Confirm delete operation
if (MessageBox.Show("Are you sure you want to delete this item?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
// Remove the row from the DataGridView
invoiceDataGridView.Rows.RemoveAt(e.RowIndex);
}
}
}
Private Sub SetupDataGridViewColumns()
invoiceDataGridView.Columns.Clear() ' Clear existing columns if any
' Now add the rest of your columns
invoiceDataGridView.Columns.Add("itemIdColumn", "Item ID")
invoiceDataGridView.Columns.Add("descriptionColumn", "Description")
invoiceDataGridView.Columns.Add("quantityColumn", "Quantity")
invoiceDataGridView.Columns.Add("unitPriceColumn", "Unit Price")
invoiceDataGridView.Columns.Add("totalPriceColumn", "Total Price")
' Set the Total Price column to read-only as it will be calculated automatically
invoiceDataGridView.Columns ("totalPriceColumn").ReadOnly = True
' Add a button column for delete action
Dim deleteButtonColumn As New DataGridViewButtonColumn()
deleteButtonColumn.HeaderText = ""
deleteButtonColumn.Name = "deleteButtonColumn"
deleteButtonColumn.Text = "Delete"
deleteButtonColumn.UseColumnTextForButtonValue = True ' This will set the button text to "Delete"
' Add the delete button column to the DataGridView
invoiceDataGridView.Columns.Add(deleteButtonColumn)
End Sub
'INSTANT VB WARNING: The following constructor is declared outside of its associated class:
'ORIGINAL LINE: public Form1()
Public Sub New()
InitializeComponent()
SetupDataGridViewColumns()
' Wire up the CellClick event to a handler
AddHandler invoiceDataGridView.CellClick, AddressOf invoiceDataGridView_CellClick
End Sub
Private Sub invoiceDataGridView_CellClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
' If the clicked cell is part of the button column and not the header row
If e.ColumnIndex = invoiceDataGridView.Columns ("deleteButtonColumn").Index AndAlso e.RowIndex >= 0 Then
' Confirm delete operation
If MessageBox.Show("Are you sure you want to delete this item?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
' Remove the row from the DataGridView
invoiceDataGridView.Rows.RemoveAt(e.RowIndex)
End If
End If
End Sub
當使用者輸入項目細節並點擊「新增項目」時,btnAddItem_Click 事件收集輸入資料,驗證之後,然後呼叫 AddItemToInvoice。 此方法將使用輸入的值向 DataGridView 添加新行,計算商品的總價格並更新在表單底部顯示的發票總金額。
public void AddItemToInvoice(string itemId, string description, int quantity, decimal unitPrice)
{
decimal totalPrice = quantity * unitPrice;
invoiceDataGridView.Rows.Add(itemId, description, quantity, unitPrice, totalPrice);
}
private void CalculateTotalAmount()
{
decimal totalAmount = 0m;
foreach (DataGridViewRow row in invoiceDataGridView.Rows)
{
totalAmount += Convert.ToDecimal(row.Cells ["totalPriceColumn"].Value ?? 0);
}
lblTotalAmount.Text = $"{totalAmount:C2}"; // Assuming 'lblTotalAmount' is the name of your Label control
}
private void btnAddItem_Click(object sender, EventArgs e)
{
// Assuming your text boxes and numeric up/down controls have the following names:
// txtItemID, txtDescription, txtUnitPrice, and numericUpDownQuantity
// Collect data from input controls
string itemId = txtItemID.Text;
string description = txtDescription.Text;
int quantity = (int)numericUpDownQuantity.Value;
decimal unitPrice;
// Validate the collected data
// Check if the unit price is a valid decimal
bool isUnitPriceValid = decimal.TryParse(txtUnitPrice.Text, out unitPrice);
// Additional validation can be implemented as needed
if (string.IsNullOrEmpty(itemId)
string.IsNullOrEmpty(description)
quantity <= 0
!isUnitPriceValid
unitPrice <= 0)
{
MessageBox.Show("Please enter valid data for all fields.", "Invalid Data", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// Add data to the DataGridView
AddItemToInvoice(itemId, description, quantity, unitPrice);
// Optionally, clear the input fields after adding the item to the grid
txtItemID.Clear();
txtDescription.Clear();
txtUnitPrice.Clear();
numericUpDownQuantity.Value = 0; // or numericUpDownQuantity.Minimum if 0 is not allowed
CalculateTotalAmount();
}
public void AddItemToInvoice(string itemId, string description, int quantity, decimal unitPrice)
{
decimal totalPrice = quantity * unitPrice;
invoiceDataGridView.Rows.Add(itemId, description, quantity, unitPrice, totalPrice);
}
private void CalculateTotalAmount()
{
decimal totalAmount = 0m;
foreach (DataGridViewRow row in invoiceDataGridView.Rows)
{
totalAmount += Convert.ToDecimal(row.Cells ["totalPriceColumn"].Value ?? 0);
}
lblTotalAmount.Text = $"{totalAmount:C2}"; // Assuming 'lblTotalAmount' is the name of your Label control
}
private void btnAddItem_Click(object sender, EventArgs e)
{
// Assuming your text boxes and numeric up/down controls have the following names:
// txtItemID, txtDescription, txtUnitPrice, and numericUpDownQuantity
// Collect data from input controls
string itemId = txtItemID.Text;
string description = txtDescription.Text;
int quantity = (int)numericUpDownQuantity.Value;
decimal unitPrice;
// Validate the collected data
// Check if the unit price is a valid decimal
bool isUnitPriceValid = decimal.TryParse(txtUnitPrice.Text, out unitPrice);
// Additional validation can be implemented as needed
if (string.IsNullOrEmpty(itemId)
string.IsNullOrEmpty(description)
quantity <= 0
!isUnitPriceValid
unitPrice <= 0)
{
MessageBox.Show("Please enter valid data for all fields.", "Invalid Data", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
// Add data to the DataGridView
AddItemToInvoice(itemId, description, quantity, unitPrice);
// Optionally, clear the input fields after adding the item to the grid
txtItemID.Clear();
txtDescription.Clear();
txtUnitPrice.Clear();
numericUpDownQuantity.Value = 0; // or numericUpDownQuantity.Minimum if 0 is not allowed
CalculateTotalAmount();
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
當點擊「生成發票」時,應用程式會執行 btnInvoice_Click 事件處理器,並使用 StringBuilder 構建一個 HTML 字串。 該字串包含客戶的詳細信息以及從 DataGridView 中填充的賬單項目的樣式化 HTML 表格。 IronPDF 的渲染器然後將這個 HTML 轉換為 PDF 文件,並保存到指定的路徑。 應用程式以訊息通知使用者發票創建成功。
private void btnInvoice_Click(object sender, EventArgs e)
{
IronPdf.License.LicenseKey = "License-Key";
// Collect customer information
var customerName = txtName.Text; // Adjusted to your actual TextBox names
var customerEmail = txtEmail.Text;
var customerAddress = txtAddress.Text;
var customerPhone = txtPhone.Text;
// Start building the HTML content for the invoice
var htmlStringBuilder = new StringBuilder();
htmlStringBuilder.Append("<html>");
htmlStringBuilder.Append("<head>");
htmlStringBuilder.Append("<title>Invoice</title>");
// Add some basic CSS styles for the invoice
htmlStringBuilder.Append(@"
<style>
body {
font-family: 'Arial', sans-serif;
}
h1 {
color: #333;
text-align: center;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
border: 1px solid #999;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
h2 {
text-align: right;
margin-top: 20px;
}
.customer-info {
font-family: 'Helvetica', 'Arial', sans-serif;
line-height: 1.6;
margin-bottom: 20px;
}
.customer-info p {
margin: 0 0 10px 0;
color: #333;
}
.customer-info label {
font-weight: bold;
}
</style>");
// You can add style tags here for styling your PDF content
htmlStringBuilder.Append("</head>");
htmlStringBuilder.Append("<body>");
htmlStringBuilder.Append("<h1>Invoice</h1>");
htmlStringBuilder.Append("<div class='customer-info'>");
htmlStringBuilder.Append($"<p><strong>Customer Name:</strong> {customerName}</p>");
htmlStringBuilder.Append($"<p><strong>Customer Email:</strong> {customerEmail}</p>");
htmlStringBuilder.Append($"<p><strong>Customer Address:</strong> {customerAddress}</p>");
htmlStringBuilder.Append($"<p><strong>Customer Phone:</strong> {customerPhone}</p>");
htmlStringBuilder.Append("</div>");
// Add the invoice items
htmlStringBuilder.Append("<table border='1'><tr><th>Item ID</th><th>Description</th><th>Quantity</th><th>Unit Price</th><th>Total Price</th></tr>");
foreach (DataGridViewRow row in invoiceDataGridView.Rows)
{
if (row.IsNewRow) continue; // Skip the new row placeholder
htmlStringBuilder.Append("<tr>");
htmlStringBuilder.Append($"<td>{row.Cells ["itemIdColumn"].Value}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["descriptionColumn"].Value}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["quantityColumn"].Value}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["unitPriceColumn"].Value:C2}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["totalPriceColumn"].Value:C2}</td>");
htmlStringBuilder.Append("</tr>");
}
htmlStringBuilder.Append("</table>");
// Add the total amount
htmlStringBuilder.Append($"<h2>Total Amount: {lblTotalAmount.Text}</h2>");
// Close the HTML string
htmlStringBuilder.Append("</body></html>");
// Use IronPDF to convert the HTML string to a PDF document
var renderer = new IronPdf.ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(htmlStringBuilder.ToString());
// Save the PDF to a file
string savePath = Path.Combine($"F:\\Invoice_{DateTime.Now:yyyyMMddHHmmss}.pdf"); // to avoid file name conflicts and save to desktop
pdfDocument.SaveAs(savePath);
// Show a success dialog
MessageBox.Show("The invoice has been successfully saved to your desktop.", "Invoice Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnInvoice_Click(object sender, EventArgs e)
{
IronPdf.License.LicenseKey = "License-Key";
// Collect customer information
var customerName = txtName.Text; // Adjusted to your actual TextBox names
var customerEmail = txtEmail.Text;
var customerAddress = txtAddress.Text;
var customerPhone = txtPhone.Text;
// Start building the HTML content for the invoice
var htmlStringBuilder = new StringBuilder();
htmlStringBuilder.Append("<html>");
htmlStringBuilder.Append("<head>");
htmlStringBuilder.Append("<title>Invoice</title>");
// Add some basic CSS styles for the invoice
htmlStringBuilder.Append(@"
<style>
body {
font-family: 'Arial', sans-serif;
}
h1 {
color: #333;
text-align: center;
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
border: 1px solid #999;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
h2 {
text-align: right;
margin-top: 20px;
}
.customer-info {
font-family: 'Helvetica', 'Arial', sans-serif;
line-height: 1.6;
margin-bottom: 20px;
}
.customer-info p {
margin: 0 0 10px 0;
color: #333;
}
.customer-info label {
font-weight: bold;
}
</style>");
// You can add style tags here for styling your PDF content
htmlStringBuilder.Append("</head>");
htmlStringBuilder.Append("<body>");
htmlStringBuilder.Append("<h1>Invoice</h1>");
htmlStringBuilder.Append("<div class='customer-info'>");
htmlStringBuilder.Append($"<p><strong>Customer Name:</strong> {customerName}</p>");
htmlStringBuilder.Append($"<p><strong>Customer Email:</strong> {customerEmail}</p>");
htmlStringBuilder.Append($"<p><strong>Customer Address:</strong> {customerAddress}</p>");
htmlStringBuilder.Append($"<p><strong>Customer Phone:</strong> {customerPhone}</p>");
htmlStringBuilder.Append("</div>");
// Add the invoice items
htmlStringBuilder.Append("<table border='1'><tr><th>Item ID</th><th>Description</th><th>Quantity</th><th>Unit Price</th><th>Total Price</th></tr>");
foreach (DataGridViewRow row in invoiceDataGridView.Rows)
{
if (row.IsNewRow) continue; // Skip the new row placeholder
htmlStringBuilder.Append("<tr>");
htmlStringBuilder.Append($"<td>{row.Cells ["itemIdColumn"].Value}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["descriptionColumn"].Value}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["quantityColumn"].Value}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["unitPriceColumn"].Value:C2}</td>");
htmlStringBuilder.Append($"<td>{row.Cells ["totalPriceColumn"].Value:C2}</td>");
htmlStringBuilder.Append("</tr>");
}
htmlStringBuilder.Append("</table>");
// Add the total amount
htmlStringBuilder.Append($"<h2>Total Amount: {lblTotalAmount.Text}</h2>");
// Close the HTML string
htmlStringBuilder.Append("</body></html>");
// Use IronPDF to convert the HTML string to a PDF document
var renderer = new IronPdf.ChromePdfRenderer();
var pdfDocument = renderer.RenderHtmlAsPdf(htmlStringBuilder.ToString());
// Save the PDF to a file
string savePath = Path.Combine($"F:\\Invoice_{DateTime.Now:yyyyMMddHHmmss}.pdf"); // to avoid file name conflicts and save to desktop
pdfDocument.SaveAs(savePath);
// Show a success dialog
MessageBox.Show("The invoice has been successfully saved to your desktop.", "Invoice Saved", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
一旦 Windows Forms 應用程式開發完成並整合了 IronPDF 庫,運行應用程式並生成 PDF 發票就是一個簡單的過程。 使用者透過應用程式的介面輸入資料並產生所需的輸出。 以下是流程的典型展開方式:
通過在 Visual Studio 中運行應用程式或執行已編譯的可執行檔來啟動應用程式。(.exe)直接從 Windows 環境中。 應用程式的表單顯示,準備好供使用者互動。
在表單頂部的指定文本框中輸入客戶資料,包括客戶的姓名、地址、電子郵件和電話號碼。 在表單的「新增發票項目」部分,透過填寫「項目編號」、「描述」、「數量」和「單價」欄位來新增發票項目。
點擊「添加項目」 以將項目包括在發票列表中。DataGridView 將更新以顯示新項目,其詳細信息及計算的總價。重複此過程以將所有必要的項目添加到發票中。「總金額」標籤將動態更新,以反映列出的項目之累計總額。
點擊「生成發票」 一旦所有項目都添加完畢且顧客資訊填寫完整。 應用程式將數據編譯成 HTML 格式,並使用 CSS 樣式化。 IronPDF 接管將 HTML 字串轉換為 PDF 文件的工作。 它使用Chrome引擎渲染,確保高度符合現代網頁標準。
在生成 PDF 之後,應用程序將 PDF 文件保存到指定的位置,通常是在應用程式相同的目錄或用戶自定義的路徑中。 系統會顯示成功訊息以通知使用者 PDF 發票已成功儲存。 然後用戶可以導航到儲存的位置以查看或分發發票。
輸出 PDF 在頂端顯示客戶信息,其後是購買項目的詳細表格,包括描述、數量和價格。 發票的總金額列於文件的結尾,清楚表明客戶需要支付的金額。 PDF 被設計成乾淨且專業,利用代碼中定義的 CSS 來確保發票不僅具有功能性,還且具備美觀性。
在徹底測試您的 Windows Forms 應用程式並確保資料輸入、PDF 生成和輸出等所有功能完美運作後,下一階段是將您的專案打包成可執行檔。(.exe)檔案。此轉換過程在 .NET framework 中進行簡化,確保您的應用程式可以在 Windows 機器上安裝和使用。
以下是創建可執行檔的分步方法:
建置應用程式: 前往「建置」選單並選擇「建置解決方案」。這會將程式碼編譯成組件並執行必要的優化。
找到可執行檔: 建置完成後,導覽至專案目錄內的 'bin\Debug\net8.0' 資料夾。 在這裡,您將找到用於執行應用程式的 .exe 檔案以及任何其他所需的相依性。
測試可執行檔案: 最佳做法是在不同的機器上運行 .exe 文件,以確認它在您的開發環境之外正常運行。
準備發行: 如果不需要其他相依性,您可以直接分享 .exe 文件進行發行。 然而,為了更專業的方法,可以考慮使用 Visual Studio 中的設置專案或像 Inno Setup 或 WiX Toolset 這樣的第三方安裝程序包來創建安裝程序。 安裝程式可以管理安裝過程,創建捷徑,並處理其他複雜性,例如如有需要可在 Windows 註冊表中註冊。
通過遵循這些步驟,您的 Windows Forms 應用程式將被壓縮成單一的可執行檔,準備好被分享和使用。 此轉換標誌著開發過程的終點,從您的開發機器上的項目轉變為可部署的軟體,能夠高效地分發並安裝到多種 Windows 環境中。
總之,使用IronPDF和.NET Framework開發用於生成PDF發票的Windows Forms應用程式,展示了軟體開發原則的實際應用。 此專案不僅展示了 .NET 生態系統的多樣性和強大功能,還說明了開發人員如何整合類似 IronPDF 的第三方函式庫來擴展功能並滿足特定的業務需求。
通過遵循所述步驟,從設置使用者介面到實現 PDF 生成以及將應用程式打包成可執行文件,開發人員可以創建一個功能齊全且使用者友好的應用程式。 這個過程強調結合強大的程式設計框架與創新的庫來解決現實世界問題的重要性,最終提供一個既有效又高效的產品。
IronPDF 慷慨地提供一個生成 PDF 功能的免費試用供開發人員探索其功能並確定其如何最適合他們的需求。 一旦您體驗了其優勢並準備將IronPDF整合到您的生產環境中,許可證價格方案非常平價。