C# ObservableCollection (Jak to działa dla deweloperów)
W C# ObservableCollection to potężna struktura danych, która automatycznie powiadamia słuchaczy, gdy elementy są dodawane, usuwane lub zmieniane. Jest to szczególnie przydatne w scenariuszach dynamicznego zbierania danych, na przykład gdy trzeba odzwierciedlić zmiany w czasie rzeczywistym w interfejsie użytkownika lub raportach. Po połączeniu z IronPDF ta potężna kolekcja może być używana do generowania dynamicznych PDF-ów na podstawie danych na żywo.
IronPDF to solidna biblioteka do generowania PDF-ów w C#. Dzięki możliwościom konwersji HTML do PDF, łatwo jest tworzyć wysokiej jakości PDF-y, niezależnie czy trzeba tworzyć faktury, raporty, czy inne dokumenty na podstawie danych w czasie rzeczywistym. W tym artykule pokażemy, jak zintegrować klasę ObservableCollection z IronPDF, wykorzystując wiązanie danych do generowania PDF, który dynamicznie aktualizuje się w miarę zmian danych.
Zrozumienie ObservableCollection
Co to jest ObservableCollection?
ObservableCollection to klasa w C# implementująca interfejs INotifyCollectionChanged, który zapewnia powiadomienia, gdy elementy są dodawane, usuwane lub modyfikowane. Jest powszechnie używana do wiązania danych w aplikacjach UI, takich jak WPF, gdzie zmiany w kolekcji automatycznie wyzwalają aktualizacje w interfejsie użytkownika. W przeciwieństwie do innych kolekcji, takich jak List, ObservableCollection oferuje wbudowane powiadomienia o zdarzeniach, co czyni go idealnym do scenariuszy, w których dane muszą być odzwierciedlone w czasie rzeczywistym.
ObservableCollection automatycznie obsługuje zmiany całej kolekcji, co ułatwia zarządzanie i wyświetlanie dynamicznej kolekcji danych w twojej aplikacji.
Typowe przypadki użycia
- Wiązanie z komponentami UI: W WPF, na przykład, ObservableCollection jest często używany do wiązania danych z elementami sterującymi, takimi jak ListView, DataGrid i ComboBox. Gdy zmienia się podstawowa kolekcja, interfejs użytkownika jest automatycznie aktualizowany.
- Aktualizacje w czasie rzeczywistym: Gdy dane zmieniają się często, ObservableCollection zapewnia, że interfejs użytkownika jest zawsze zsynchronizowany. Na przykład, można go użyć do raportu na żywo, gdzie nowe wpisy danych są dodawane do kolekcji w czasie rzeczywistym, a raport aktualizuje się odpowiednio.
- Dynamiczne zmiany: Jeśli Twoja aplikacja pozwala użytkownikom dodawać, usuwać lub modyfikować dane, ObservableCollection może być użyta do automatycznego odzwierciedlenia tych zmian w UI lub innych komponentach.
Praca z IronPDF
Przegląd IronPDF

Jak wspomnieliśmy na początku tego artykułu, IronPDF to biblioteka .NET do generowania PDF, która ułatwia tworzenie, modyfikowanie i renderowanie dokumentów PDF. W przeciwieństwie do niektórych innych bibliotek PDF, IronPDF zapewnia bogaty zestaw funkcji upraszczających pracę z PDF-ami, takich jak konwersja HTML do PDF, dodawanie znaków wodnych, manipulowanie istniejącymi PDF-ami i więcej.
IronPDF pozwala również programistom na renderowanie PDF-ów z różnych źródeł danych, w tym HTML, obrazów i zwykłego tekstu, co jest szczególnie przydatne, gdy trzeba prezentować dynamiczne dane. Dzięki API IronPDF można generować wysokiej jakości PDF-y, w tym szczegółowe układy, tabele, obrazy i style.
Ustawienie IronPDF
Aby rozpocząć pracę z IronPDF, należy zainstalować bibliotekę za pomocą NuGet. Możesz dodać ją do swojego projektu, uruchamiając następujące polecenie w Konsoli Menedżera Pakietów:
Install-Package IronPdf
Po zainstalowaniu możesz zainicjować IronPDF i używać jego potężnych funkcji. W tym artykule skoncentrujemy się na generowaniu PDF-ów z dynamicznych danych w ObservableCollection.
Integracja ObservableCollection z IronPDF
Przypadek użycia: Dynamiczne generowanie PDF-ów z ObservableCollection
Wyobraźmy sobie scenariusz, w którym trzeba wygenerować fakturę PDF z listy pozycji przechowywanych w ObservableCollection. Gdy do kolekcji będą dodawane lub usuwane elementy, PDF powinien być regenerowany automatycznie, aby odzwierciedlać aktualny stan danych.
Do tego zadania, ObservableCollection zapewnia łatwy sposób zarządzania pozycjami w fakturze, a IronPDF pozwoli nam generować i eksportować fakturę do formatu PDF.
Wiązanie danych z zawartością PDF
Aby związać dane w ObservableCollection z PDF, musisz przejść przez kolekcję i dodać jej elementy do zawartości PDF. IronPDF zapewnia metody tworzenia tabel, dodawania tekstu i dostosowywania układu, co ułatwia przedstawienie danych w ustrukturyzowany sposób.
Na przykład, jeśli masz fakturę z kilkoma elementami, możesz dynamicznie wygenerować PDF, przechodząc przez ObservableCollection i dodając każdy element do tabeli lub listy w dokumencie. IronPDF pozwala na wysoki poziom dostosowania, w tym regulację czcionek, obramowań, a nawet uwzględnianie obrazów, takich jak loga lub kody kreskowe.
Przykład pierwszy: Generowanie PDF za pomocą ObservableCollection
Przyjrzyjmy się prostemu przykładowi, aby pokazać, jak to działa. Załóżmy, że masz kolekcję osób (reprezentowaną przez klasę Person), i chcesz wygenerować PDF, który odzwierciedla szczegóły tych osób. Za każdym razem, gdy do kolekcji dodawana jest nowa osoba, PDF będzie automatycznie aktualizowany.
Definicja klasy Person
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Public Class Person
Public Property Name() As String
Public Property Age() As Integer
End Class
W tym przypadku, klasa Person zawiera podstawowe właściwości, takie jak Name i Age. Będziemy używać tej klasy w połączeniu z ObservableCollection, aby dynamicznie generować PDF.
Tworzenie ObservableCollection
using System.Collections.ObjectModel;
var collection = new ObservableCollection<Person>
{
new Person { Name = "John Doe", Age = 30 },
new Person { Name = "Jane Smith", Age = 28 }
};
using System.Collections.ObjectModel;
var collection = new ObservableCollection<Person>
{
new Person { Name = "John Doe", Age = 30 },
new Person { Name = "Jane Smith", Age = 28 }
};
Imports System.Collections.ObjectModel
Private collection = New ObservableCollection(Of Person) From {
New Person With {
.Name = "John Doe",
.Age = 30
},
New Person With {
.Name = "Jane Smith",
.Age = 28
}
}
Ta ObservableCollection zawiera kolekcję obiektów typu Person, z każdym mającym Name i Age. Gdy element jest dodawany lub usuwany, uruchamiane są obsługiwane zdarzenia, które będziemy używać do dynamicznej aktualizacji PDF.
Dodawanie obsługiwaczy zdarzeń dla zmian w kolekcji
W tym przykładzie subskrybujemy zdarzenie CollectionChanged klasy ObservableCollection, aby automatycznie regenerować PDF za każdym razem, gdy kolekcja się zmienia. To jest przydatne, jeśli musisz reagować na zmiany, takie jak dodawanie lub usuwanie obiektu Person.
// Subscribe to the ObservableCollection's CollectionChanged event
collection.CollectionChanged += (object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) =>
{
// Regenerate the PDF whenever the collection changes
GeneratePersonPDF(collection);
};
// Subscribe to the ObservableCollection's CollectionChanged event
collection.CollectionChanged += (object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) =>
{
// Regenerate the PDF whenever the collection changes
GeneratePersonPDF(collection);
};
' Subscribe to the ObservableCollection's CollectionChanged event
AddHandler collection.CollectionChanged, Sub(sender As Object, e As System.Collections.Specialized.NotifyCollectionChangedEventArgs)
' Regenerate the PDF whenever the collection changes
GeneratePersonPDF(collection)
End Sub
Dodawanie nowych osób do kolekcji
Możesz dodać nową osobę do kolekcji, a cała kolekcja wyzwoli obsługiwacz zdarzeń do regeneracji PDF. Podejście to automatycznie obsługuje zmiany dotyczące całej listy osób.
// Adding a new person to the collection
collection.Add(new Person { Name = "Alice Brown", Age = 32 });
// Adding a new person to the collection
collection.Add(new Person { Name = "Alice Brown", Age = 32 });
' Adding a new person to the collection
collection.Add(New Person With {
.Name = "Alice Brown",
.Age = 32
})
Za każdym razem, gdy dodasz nową osobę do kolekcji, PDF będzie regenerowany z uwzględnieniem nowego wpisu.
Wiązanie właściwości Age
Możesz również związać wiek osoby z jakimś zewnętrznym systemem (jak UI lub inne części aplikacji), aby automatycznie odzwierciedlało zmiany.
Oto przykład, jak właściwość Age byłaby związana w klasie Person:
public class Person
{
public string Name { get; set; }
private int _age;
public int Age
{
get { return _age; }
set
{
_age = value;
// Raise property changed event here if using data binding
}
}
}
public class Person
{
public string Name { get; set; }
private int _age;
public int Age
{
get { return _age; }
set
{
_age = value;
// Raise property changed event here if using data binding
}
}
}
Public Class Person
Public Property Name() As String
Private _age As Integer
Public Property Age() As Integer
Get
Return _age
End Get
Set(ByVal value As Integer)
_age = value
' Raise property changed event here if using data binding
End Set
End Property
End Class
Użycie ObservableCollection z Binding
Pokażmy, jak używać wiązania wieku do elementu UI, aktualizować jego wartość i obserwować zmiany odzwierciedlane w kolekcji:
ObservableCollection<Person> people = new ObservableCollection<Person>
{
new Person { Name = "John", Age = 30 },
new Person { Name = "Jane", Age = 28 }
};
// Binding the Age of the first person to a UI element (pseudo-code)
someUIElement.Text = people[0].Age.ToString();
ObservableCollection<Person> people = new ObservableCollection<Person>
{
new Person { Name = "John", Age = 30 },
new Person { Name = "Jane", Age = 28 }
};
// Binding the Age of the first person to a UI element (pseudo-code)
someUIElement.Text = people[0].Age.ToString();
Dim people As New ObservableCollection(Of Person) From {
New Person With {
.Name = "John",
.Age = 30
},
New Person With {
.Name = "Jane",
.Age = 28
}
}
' Binding the Age of the first person to a UI element (pseudo-code)
someUIElement.Text = people(0).Age.ToString()
Generowanie PDF z IronPDF
Teraz, gdy ustawiliśmy ObservableCollection i dodaliśmy obsługiwane zdarzenia, czas skupić się na generowaniu PDF, który odzwierciedla dynamiczną kolekcję osób.
using IronPdf;
public void GeneratePersonPDF(ObservableCollection<Person> people)
{
var pdf = new ChromePdfRenderer(); // Initialize IronPDF's ChromePdfRenderer class
// Create HTML content representing the people in the collection
var htmlContent = "<h1>People Information</h1><table border='1' cellpadding='5' cellspacing='0'>" +
"<tr><th>Name</th><th>Age</th></tr>";
foreach (var person in people)
{
htmlContent += $"<tr><td>{person.Name}</td><td>{person.Age}</td></tr>";
}
htmlContent += "</table>";
// Convert the HTML content to a PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the generated PDF to disk
pdfDocument.SaveAs("PeopleInformation.pdf");
}
using IronPdf;
public void GeneratePersonPDF(ObservableCollection<Person> people)
{
var pdf = new ChromePdfRenderer(); // Initialize IronPDF's ChromePdfRenderer class
// Create HTML content representing the people in the collection
var htmlContent = "<h1>People Information</h1><table border='1' cellpadding='5' cellspacing='0'>" +
"<tr><th>Name</th><th>Age</th></tr>";
foreach (var person in people)
{
htmlContent += $"<tr><td>{person.Name}</td><td>{person.Age}</td></tr>";
}
htmlContent += "</table>";
// Convert the HTML content to a PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the generated PDF to disk
pdfDocument.SaveAs("PeopleInformation.pdf");
}
Imports IronPdf
Public Sub GeneratePersonPDF(ByVal people As ObservableCollection(Of Person))
Dim pdf = New ChromePdfRenderer() ' Initialize IronPDF's ChromePdfRenderer class
' Create HTML content representing the people in the collection
Dim htmlContent = "<h1>People Information</h1><table border='1' cellpadding='5' cellspacing='0'>" & "<tr><th>Name</th><th>Age</th></tr>"
For Each person In people
htmlContent &= $"<tr><td>{person.Name}</td><td>{person.Age}</td></tr>"
Next person
htmlContent &= "</table>"
' Convert the HTML content to a PDF
Dim pdfDocument = pdf.RenderHtmlAsPdf(htmlContent)
' Save the generated PDF to disk
pdfDocument.SaveAs("PeopleInformation.pdf")
End Sub
Przykład drugi: Generowanie faktury PDF z ObservableCollection
Oto przykład, jak wygenerować PDF z ObservableCollection pozycji faktury, używając IronPDF:
Krok 1: Definicja klasy pozycji faktury
Ta klasa reprezentuje pozycję w fakturze, z właściwościami dla nazwy pozycji, ilości, ceny i całkowitej ceny.
public class InvoiceItem
{
public string ItemName { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
public decimal Total => Quantity * Price;
}
public class InvoiceItem
{
public string ItemName { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
public decimal Total => Quantity * Price;
}
Public Class InvoiceItem
Public Property ItemName() As String
Public Property Quantity() As Integer
Public Property Price() As Decimal
Public ReadOnly Property Total() As Decimal
Get
Return Quantity * Price
End Get
End Property
End Class
Krok 2: Inicjalizacja ObservableCollection
Ten przykład inicjalizuje ObservableCollection zawierającą kilka pozycji faktury. Możesz dynamicznie dodawać, usuwać lub modyfikować elementy w tej kolekcji.
ObservableCollection<InvoiceItem> invoiceItems = new ObservableCollection<InvoiceItem>
{
new InvoiceItem { ItemName = "Item 1", Quantity = 2, Price = 10.00m },
new InvoiceItem { ItemName = "Item 2", Quantity = 1, Price = 25.00m },
new InvoiceItem { ItemName = "Item 3", Quantity = 5, Price = 5.00m }
};
ObservableCollection<InvoiceItem> invoiceItems = new ObservableCollection<InvoiceItem>
{
new InvoiceItem { ItemName = "Item 1", Quantity = 2, Price = 10.00m },
new InvoiceItem { ItemName = "Item 2", Quantity = 1, Price = 25.00m },
new InvoiceItem { ItemName = "Item 3", Quantity = 5, Price = 5.00m }
};
Dim invoiceItems As New ObservableCollection(Of InvoiceItem) From {
New InvoiceItem With {
.ItemName = "Item 1",
.Quantity = 2,
.Price = 10.00D
},
New InvoiceItem With {
.ItemName = "Item 2",
.Quantity = 1,
.Price = 25.00D
},
New InvoiceItem With {
.ItemName = "Item 3",
.Quantity = 5,
.Price = 5.00D
}
}
Krok 3: Generowanie PDF z IronPDF
Tutaj tworzymy funkcję do generowania PDF. Funkcja ta używa danych z ObservableCollection, konwertuje je na HTML, który następnie jest renderowany jako PDF przy użyciu IronPDF.
public void GenerateInvoicePDF(ObservableCollection<InvoiceItem> items)
{
var pdf = new ChromePdfRenderer(); // Initialize IronPDF's ChromePdfRenderer class
// Create HTML content representing the invoice
var htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" +
"<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>";
foreach (var item in items)
{
htmlContent += $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>";
}
htmlContent += "</table>";
// Convert the HTML content to a PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the generated PDF to disk
pdfDocument.SaveAs("Invoice.pdf");
}
public void GenerateInvoicePDF(ObservableCollection<InvoiceItem> items)
{
var pdf = new ChromePdfRenderer(); // Initialize IronPDF's ChromePdfRenderer class
// Create HTML content representing the invoice
var htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" +
"<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>";
foreach (var item in items)
{
htmlContent += $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>";
}
htmlContent += "</table>";
// Convert the HTML content to a PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the generated PDF to disk
pdfDocument.SaveAs("Invoice.pdf");
}
Public Sub GenerateInvoicePDF(ByVal items As ObservableCollection(Of InvoiceItem))
Dim pdf = New ChromePdfRenderer() ' Initialize IronPDF's ChromePdfRenderer class
' Create HTML content representing the invoice
Dim htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" & "<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>"
For Each item In items
htmlContent &= $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>"
Next item
htmlContent &= "</table>"
' Convert the HTML content to a PDF
Dim pdfDocument = pdf.RenderHtmlAsPdf(htmlContent)
' Save the generated PDF to disk
pdfDocument.SaveAs("Invoice.pdf")
End Sub
Krok 4: Subskrybowanie zdarzenia CollectionChanged
Ponieważ ObservableCollection automatycznie powiadamia o zmianach, możesz łatwo regenerować PDF za każdym razem, gdy kolekcja jest aktualizowana. Na przykład, jeśli pozycja jest dodawana lub usuwana, PDF można regenerować z zaktualizowanymi danymi.
Oto, jak możesz subskrybować zdarzenie CollectionChanged i regenerować PDF za każdym razem, gdy kolekcja się zmienia:
// Subscribe to the ObservableCollection's CollectionChanged event
invoiceItems.CollectionChanged += (sender, e) =>
{
// Regenerate the PDF whenever the collection changes
GenerateInvoicePDF(invoiceItems);
};
// Subscribe to the ObservableCollection's CollectionChanged event
invoiceItems.CollectionChanged += (sender, e) =>
{
// Regenerate the PDF whenever the collection changes
GenerateInvoicePDF(invoiceItems);
};
' Subscribe to the ObservableCollection's CollectionChanged event
AddHandler invoiceItems.CollectionChanged, Sub(sender, e)
' Regenerate the PDF whenever the collection changes
GenerateInvoicePDF(invoiceItems)
End Sub
Krok 5: Dodawanie pozycji i testowanie
Możesz teraz przetestować, dodając nowe pozycje do ObservableCollection i obserwować, jak PDF jest automatycznie regenerowany.
// Adding a new item to the ObservableCollection
invoiceItems.Add(new InvoiceItem { ItemName = "Item 4", Quantity = 3, Price = 12.50m });
// Adding a new item to the ObservableCollection
invoiceItems.Add(new InvoiceItem { ItemName = "Item 4", Quantity = 3, Price = 12.50m });
' Adding a new item to the ObservableCollection
invoiceItems.Add(New InvoiceItem With {
.ItemName = "Item 4",
.Quantity = 3,
.Price = 12.50D
})
Pełny przykład kodu
using System;
using System.Collections.ObjectModel;
using IronPdf;
public class InvoiceItem
{
public string ItemName { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
// Property to calculate the total price for each item
public decimal Total => Quantity * Price;
}
public class InvoiceGenerator
{
// Function to generate the invoice PDF
public void GenerateInvoicePDF(ObservableCollection<InvoiceItem> items)
{
var pdf = new ChromePdfRenderer(); // Initialize IronPDF's ChromePdfRenderer class
// Create HTML content representing the invoice
var htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" +
"<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>";
foreach (var item in items)
{
htmlContent += $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>";
}
htmlContent += "</table>";
// Convert the HTML content to a PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the generated PDF to disk
pdfDocument.SaveAs("Invoice.pdf");
}
// Main function to test the code
public static void Main(string[] args)
{
var invoiceItems = new ObservableCollection<InvoiceItem>
{
new InvoiceItem { ItemName = "Item 1", Quantity = 2, Price = 10.00m },
new InvoiceItem { ItemName = "Item 2", Quantity = 1, Price = 25.00m },
new InvoiceItem { ItemName = "Item 3", Quantity = 5, Price = 5.00m }
};
var invoiceGenerator = new InvoiceGenerator();
// Subscribe to the ObservableCollection's CollectionChanged event
invoiceItems.CollectionChanged += (sender, e) =>
{
// Regenerate the PDF whenever the collection changes
invoiceGenerator.GenerateInvoicePDF(invoiceItems);
};
// Generate initial PDF
invoiceGenerator.GenerateInvoicePDF(invoiceItems);
// Add a new item to the collection and automatically regenerate the PDF
invoiceItems.Add(new InvoiceItem { ItemName = "Item 4", Quantity = 3, Price = 12.50m });
// Remove an item and see the PDF update
invoiceItems.RemoveAt(0);
}
}
using System;
using System.Collections.ObjectModel;
using IronPdf;
public class InvoiceItem
{
public string ItemName { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
// Property to calculate the total price for each item
public decimal Total => Quantity * Price;
}
public class InvoiceGenerator
{
// Function to generate the invoice PDF
public void GenerateInvoicePDF(ObservableCollection<InvoiceItem> items)
{
var pdf = new ChromePdfRenderer(); // Initialize IronPDF's ChromePdfRenderer class
// Create HTML content representing the invoice
var htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" +
"<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>";
foreach (var item in items)
{
htmlContent += $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>";
}
htmlContent += "</table>";
// Convert the HTML content to a PDF
var pdfDocument = pdf.RenderHtmlAsPdf(htmlContent);
// Save the generated PDF to disk
pdfDocument.SaveAs("Invoice.pdf");
}
// Main function to test the code
public static void Main(string[] args)
{
var invoiceItems = new ObservableCollection<InvoiceItem>
{
new InvoiceItem { ItemName = "Item 1", Quantity = 2, Price = 10.00m },
new InvoiceItem { ItemName = "Item 2", Quantity = 1, Price = 25.00m },
new InvoiceItem { ItemName = "Item 3", Quantity = 5, Price = 5.00m }
};
var invoiceGenerator = new InvoiceGenerator();
// Subscribe to the ObservableCollection's CollectionChanged event
invoiceItems.CollectionChanged += (sender, e) =>
{
// Regenerate the PDF whenever the collection changes
invoiceGenerator.GenerateInvoicePDF(invoiceItems);
};
// Generate initial PDF
invoiceGenerator.GenerateInvoicePDF(invoiceItems);
// Add a new item to the collection and automatically regenerate the PDF
invoiceItems.Add(new InvoiceItem { ItemName = "Item 4", Quantity = 3, Price = 12.50m });
// Remove an item and see the PDF update
invoiceItems.RemoveAt(0);
}
}
Imports System
Imports System.Collections.ObjectModel
Imports IronPdf
Public Class InvoiceItem
Public Property ItemName() As String
Public Property Quantity() As Integer
Public Property Price() As Decimal
' Property to calculate the total price for each item
Public ReadOnly Property Total() As Decimal
Get
Return Quantity * Price
End Get
End Property
End Class
Public Class InvoiceGenerator
' Function to generate the invoice PDF
Public Sub GenerateInvoicePDF(ByVal items As ObservableCollection(Of InvoiceItem))
Dim pdf = New ChromePdfRenderer() ' Initialize IronPDF's ChromePdfRenderer class
' Create HTML content representing the invoice
Dim htmlContent = "<h1>Invoice</h1><table border='1' cellpadding='5' cellspacing='0'>" & "<tr><th>Item</th><th>Quantity</th><th>Price</th><th>Total</th></tr>"
For Each item In items
htmlContent &= $"<tr><td>{item.ItemName}</td><td>{item.Quantity}</td><td>{item.Price:C}</td><td>{item.Total:C}</td></tr>"
Next item
htmlContent &= "</table>"
' Convert the HTML content to a PDF
Dim pdfDocument = pdf.RenderHtmlAsPdf(htmlContent)
' Save the generated PDF to disk
pdfDocument.SaveAs("Invoice.pdf")
End Sub
' Main function to test the code
Public Shared Sub Main(ByVal args() As String)
Dim invoiceItems = New ObservableCollection(Of InvoiceItem) From {
New InvoiceItem With {
.ItemName = "Item 1",
.Quantity = 2,
.Price = 10.00D
},
New InvoiceItem With {
.ItemName = "Item 2",
.Quantity = 1,
.Price = 25.00D
},
New InvoiceItem With {
.ItemName = "Item 3",
.Quantity = 5,
.Price = 5.00D
}
}
'INSTANT VB NOTE: The variable invoiceGenerator was renamed since it may cause conflicts with calls to static members of the user-defined type with this name:
Dim invoiceGenerator_Conflict As New InvoiceGenerator()
' Subscribe to the ObservableCollection's CollectionChanged event
AddHandler invoiceItems.CollectionChanged, Sub(sender, e)
' Regenerate the PDF whenever the collection changes
invoiceGenerator_Conflict.GenerateInvoicePDF(invoiceItems)
End Sub
' Generate initial PDF
invoiceGenerator_Conflict.GenerateInvoicePDF(invoiceItems)
' Add a new item to the collection and automatically regenerate the PDF
invoiceItems.Add(New InvoiceItem With {
.ItemName = "Item 4",
.Quantity = 3,
.Price = 12.50D
})
' Remove an item and see the PDF update
invoiceItems.RemoveAt(0)
End Sub
End Class
Wynik

Co robi kod
- Klasa InvoiceItem: Reprezentuje pozycję faktury z właściwościami ItemName, Quantity, Price i obliczonym Total.
- ObservableCollection: Używana do przechowywania listy pozycji faktury. Kolekcja automatycznie powiadamia słuchaczy o jakichkolwiek zmianach (np. gdy elementy są dodawane lub usuwane).
- GenerateInvoicePDF: Ta metoda tworzy zawartość HTML reprezentującą fakturę i używa IronPDF do konwersji jej do PDF.
- CollectionChanged: Zdarzenie ObservableCollection obsługiwane jest w celu regeneracji PDF za każdym razem, gdy kolekcja się zmienia, co sprawia, że generowanie PDF jest dynamiczne.
- Testowanie: Metoda Main demonstruje, jak dodawanie i usuwanie elementów z ObservableCollection wyzwala regenerację PDF.
Kwestie związane z wydajnością
Obsługa dużych kolekcji
Podczas pracy z dużymi instancjami ObservableCollection, wydajność może stać się problemem. Regeneracja PDF za każdym razem, gdy kolekcja się zmienia, może być zasobożerna, jeśli elementów jest dużo. Aby zminimalizować ten problem, rozważ porcjowanie aktualizacji lub używanie technik, takich jak paginacja, aby uniknąć przeciążenia procesu generacji PDF.
Efektywność renderowania PDF
Aby zapewnić efektywność renderowania PDF, zapamiętaj poniższe wskazówki:
- Minimalizuj niepotrzebne ponowne renderowanie: Regeneruj PDF tylko wtedy, gdy dane zmieniają się znacząco (np. gdy elementy są dodawane lub usuwane).
- Optymalizuj układ tabeli: Podczas renderowania dużych zestawów danych, podziel je na mniejsze, bardziej zarządzalne sekcje, aby poprawić czas renderowania.
- Używaj cache: Cache wcześniej wygenerowane PDF-y dla danych statycznych lub rzadko zmieniających się.
Wnioski
Łącząc ObservableCollection języka C# z IronPDF, możesz łatwo generować dynamiczne PDF-y, które odzwierciedlają zmiany w czasie rzeczywistym w danych aplikacji. Niezależnie czy generujesz faktury, raporty czy inne dokumenty, to podejście pozwala automatycznie aktualizować zawartość PDF za każdym razem, gdy zmienia się podstawowa kolekcja.
Integracja ObservableCollection zapewnia, że twoja aplikacja jest zawsze na bieżąco przy minimalnym wysiłku, podczas gdy IronPDF zajmuje się ciężką pracą renderowania wysokiej jakości PDF-ów. Śledząc najlepsze praktyki i wskazówki dotyczące wydajności, omawiane w tym artykule, możesz stworzyć bezproblemową doświadczenie generowania PDF dla swoich aplikacji .NET.
Chcesz samodzielnie wypróbować IronPDF? Pobierz bezpłatną wersję próbną już dziś, aby podnieść swoje projekty PDF w C#, i koniecznie sprawdź sekcję obszernej dokumentacji, aby zobaczyć więcej tej biblioteki w akcji.
Często Zadawane Pytania
Co to jest ObservableCollection w C#?
ObservableCollection to klasa w języku C#, która implementuje interfejs INotifyCollectionChanged. Zapewnia powiadomienia, gdy elementy są dodawane, usuwane lub modyfikowane, dzięki czemu idealnie nadaje się do wiązania danych w aplikacjach UI, w których wymagane są aktualizacje w czasie rzeczywistym.
Jak mogę wygenerować PDF z dynamicznych danych w C#?
Korzystając z IronPDF, można generować pliki PDF z dynamicznych danych, wykorzystując ObservableCollection języka C#. Gdy kolekcja jest aktualizowana, można automatycznie zregenerować plik PDF, aby odzwierciedlał bieżący stan danych.
Jakie są korzyści z używania ObservableCollection z generowaniem PDF?
ObservableCollection pozwala na śledzenie danych w czasie rzeczywistym, co jest korzystne podczas generowania plików PDF, które muszą odzwierciedlać zmiany danych na żywo. W połączeniu z IronPDF zapewnia, że wszelkie aktualizacje danych są natychmiast odzwierciedlane w pliku PDF.
Jak można powiązać dane z ObservableCollection z PDF w C#?
Możesz powiązać dane z ObservableCollection z PDF przez iterację nad elementami kolekcji i użycie metod IronPDF do dodania ich do PDF jako strukturalne elementy, takie jak tabele lub listy. To zapewnia, że zawartość PDF jest zawsze zsynchronizowana z danymi.
Jaki jest powszechny scenariusz użycia dla generowania PDF z ObservableCollection w C#?
Powszechny scenariusz użycia to generowanie faktur z ObservableCollection przedmiotów. Gdy elementy są dodawane lub usuwane z kolekcji, faktura PDF może być przegenerowana, aby dokładnie odzwierciedlać bieżącą listę przedmiotów, zapewniając aktualną dokumentację.
Jak IronPDF przetwarza konwersję HTML na PDF w C#?
IronPDF może konwertować HTML na PDF używając metod takich jak RenderHtmlAsPdf i RenderHtmlFileAsPdf. Pozwala to programistom tworzyć PDF z stron internetowych lub ciągów HTML, ułatwiając renderowanie dynamicznej zawartości.
Co należy uwzględnić podczas pracy z dużymi ObservableCollection do generowania PDF?
Podczas pracy z dużymi kolekcjami rozważ użycie paginacji, partiowanie aktualizacji i optymalizację układu, aby zapobiec problemom z wydajnością. Optymalizacje buforowania i renderowania IronPDF mogą również pomóc w efektywnym zarządzaniu dużymi danymi.
Jak IronPDF może zwiększyć produktywność w aplikacjach .NET?
IronPDF zwiększa produktywność, oferując solidne funkcje tworzenia PDF, takie jak szczegółowa personalizacja układu, konwersja HTML na PDF i integracja z różnorodnymi źródłami danych. Upraszcza to złożone zadania związane z PDF, pozwalając programistom skupić się na logice aplikacji.




