Przejdź do treści stopki
POMOC .NET

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

C# ObservableCollection (Jak Działa dla Programistów): Rysunek 1

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
$vbLabelText   $csharpLabel

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
	}
}
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
})
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
	}
}
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
})
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Wynik

C# ObservableCollection (Jak Działa dla Programistów): Rysunek 2 - plik PDF wyjściowy

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.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie