C# ObservableCollection (Geliştiriciler için Nasıl Çalışır)
C#'da, ObservableCollection, dinleyicileri öğeler eklendiğinde, kaldırıldığında veya değiştirildiğinde otomatik olarak bilgilendiren güçlü bir veri yapısıdır. Özellikle, kullanıcı arayüzünüzde veya raporlarınızda gerçek zamanlı değişiklikleri yansıtmanız gerektiğinde dinamik veri toplama senaryoları için kullanışlıdır. IronPDF ile birleştirildiğinde, bu güçlü koleksiyon canlı verilere dayalı dinamik PDF'ler üretmek için kullanılabilir.
IronPDF, C#'ta PDF oluşturmak için sağlam bir kütüphanedir. HTML-to-PDF dönüştürme kabiliyetleri ile, ister fatura, ister rapor veya gerçek zamanlı veriye dayalı başka belgeler oluşturmanız gerekse, yüksek kaliteli PDF'ler oluşturmanız kolaydır. Bu makalede, ObservableCollection sınıfını IronPDF ile entegre ederek, veri değiştiğinde dinamik olarak güncellenen bir PDF oluşturmak için veri bağlamayı nasıl kullanacağınızı göstereceğiz.
ObservableCollection Anlama
ObservableCollection Nedir?
ObservableCollection, C#'da öğeler eklendiğinde, kaldırıldığında veya değiştirildiğinde bildirimler sağlayan INotifyCollectionChanged arayüzünü uygulayan bir sınıftır. WPF gibi kullanıcı arayüzü uygulamalarında veri bağlama için yaygın olarak kullanılır, burada koleksiyondaki değişiklikler kullanıcı arayüzünde otomatik olarak tetiklenir. List gibi diğer koleksiyonlardan farklı olarak, bir ObservableCollection, verilerin gerçek zamanlı yansıtılması gerektiği senaryolar için mükemmel olan yerleşik olay bildirimleri sunar.
ObservableCollection, tüm koleksiyondaki değişiklikleri otomatik olarak yönetir, dinamik veri koleksiyonunu uygulamanızda yönetmeyi ve görüntülemeyi kolaylaştırır.
Yaygın Kullanım Alanları
- Kullanıcı arayüzü bileşenleriyle bağlama: Örneğin, WPF'de ObservableCollection genellikle ListView, DataGrid ve ComboBox gibi kontrol elemanlarına veri bağlamak için kullanılır. Altındaki koleksiyon değiştiğinde, kullanıcı arayüzü otomatik olarak güncellenir.
- Gerçek zamanlı güncellemeler: Veri sıkça değiştiğinde, ObservableCollection kullanıcı arayüzünün her zaman senkronize olmasını sağlar. Örneğin, yeni veri girdilerinin gerçek zamanlı olarak koleksiyona eklendiği ve raporun buna uygun şekilde güncellendiği bir canlı rapor için kullanabilirsiniz.
- Dinamik değişiklikler: Uygulamanız kullanıcıların veri ekleyebileceği, silebileceği veya değiştirebileceği durumda, ObservableCollection bu değişiklikleri kullanıcı arayüzünde veya diğer bileşenlerde otomatik olarak yansıtabilir.
IronPDF ile Çalışmak
IronPDF Genel Bakış

Bu makalenin başında mentioned, IronPDF, PDF dokümanlarını oluşturan, düzenleyen ve işleyen bir .NET PDF üretme kütüphanesidir. Bazı diğer PDF kütüphanelerinden farklı olarak, IronPDF, HTML'yi PDF'ye dönüştürme, filigran ekleme, mevcut PDF'lerle oynama gibi PDF'lerle çalışmayı basitleştiren zengin özellik seti sunar.
IronPDF ayrıca geliştiricilerin HTML, görüntüler ve düz metin gibi farklı veri kaynaklarından PDF sunmalarına izin verir, bu da dinamik veriyi sunmanız gerektiğinde oldukça kullanışlı olabilir. IronPDF'nin API'si ile detaylı düzen, tablolar, görüntüler ve stiller içeren yüksek kaliteli PDF'ler oluşturabilirsiniz.
IronPDF Kurulumu
IronPDF ile başlamak için kütüphaneyi NuGet üzerinden yüklemeniz gerekir. Paket Yöneticisi Konsolunda aşağıdaki komutu çalıştırarak projenize ekleyebilirsiniz:
Install-Package IronPdf
Yüklendikten sonra, IronPDF'yi başlatabilir ve güçlü özelliklerinden yararlanabilirsiniz. Bu makalede, dinamik verilerden PDF'ler üretmeye odaklanacağız.
ObservableCollection ile IronPDF'i Entegre Etmek
Kullanım Durumu: ObservableCollection'dan Dinamik PDF'ler Üretmek
Bir ObservableCollection içinde saklanan bir öğe listesinden bir fatura PDF'si üretmeniz gereken bir senaryoyu hayal edelim. Koleksiyona yeni öğeler eklendikçe veya kaldırıldıkça, verinin mevcut durumunu yansıtacak şekilde PDF otomatik olarak yeniden üretilmelidir.
Bu görev için, ObservableCollection, faturalardaki öğeleri yönetmek için kolay bir yol sağlarken, IronPDF bize faturayı bir PDF formatında üretme ve dışa aktarma imkanı verecektir.
PDF İçeriğine Veri Bağlama
Bir ObservableCollection'daki veriyi bir PDF'ye bağlamak için koleksiyonu döngüden geçirip öğelerini PDF içeriğine eklemeniz gerekir. IronPDF, veriyi yapılandırılmış bir formatta temsil etmeyi kolaylaştıran tablo oluşturma, metin ekleme ve düzeni özelleştirme yöntemleri sağlar.
Örneğin, birkaç öğeniz olan bir faturanızı varsa, ObservableCollection'ı döngüden geçirip her bir öğeyi belgeye bir tabloya veya listeye ekleyerek PDF'yi dinamik olarak oluşturabilirsiniz. IronPDF, yazı tiplerini, kenarlıkları ayarlama ve hatta logolar veya barkodlar gibi görüntüler ekleme dahil yüksek düzeyde özelleştirme sağlar.
Örnek Bir: ObservableCollection Kullanarak PDF Oluşturma
Bunun nasıl çalıştığını göstermek için basit bir örneğe bakalım. Bir kişi koleksiyonunuz (Person sınıfıyla temsil edilir) olduğunu ve bu kişilerin ayrıntılarını yansıtan bir PDF oluşturmak istediğinizi varsayalım. Koleksiyona yeni bir kişi eklediğinizde, PDF otomatik olarak güncellenecektir.
Kişi Sınıfı Örneği
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
Bu durumda, Person sınıfı Ad ve Yaş gibi temel özellikler içerir. Bu sınıfı, ObservableCollection ile birlikte PDF'yi dinamik olarak oluşturmak için kullanacağız.
ObservableCollection Oluşturma
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
}
}
Bu ObservableCollection, her biri bir Ad ve Yaş'a sahip Person nesneleri koleksiyonunu içerir. Bir öğe eklendiğinde veya kaldırıldığında, olay işleyicileri tetiklenir ve bunları PDF'yi dinamik olarak güncelleştirmek için kullanacağız.
Koleksiyon Değişiklikleri İçin Olay İşleyiciler Eklemek
Bu örnekte, koleksiyon değiştiğinde PDF'yi otomatik olarak yeniden üretmek için ObservableCollection sınıfı'nın CollectionChanged olayına abone oluyoruz. Bu, bir Person nesnesi eklemek veya kaldırmak gibi değişikliklere yanıt vermeniz gerekiyorsa kullanışlıdır.
// 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
Koleksiyona Yeni Kişi Ekleme
Koleksiyona yeni bir Kişi ekleyebilir ve tüm koleksiyon PDF'yi yeniden üretmek için olay işleyiciyi tetikler. Bu yaklaşım, tüm kişi listesinin değişikliklerini otomatik olarak işler.
// 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
})
Koleksiyona her yeni bir kişi eklediğinizde, yeni kaydı içeren PDF yeniden oluşturulur.
Yaş Özelliğini Bağlama
Bir kişinin yaş özelliğini, kullanıcı arayüzü veya uygulamanın diğer bölümleri gibi harici bir sisteme bağlayarak değişikliklerin otomatik olarak yansımasını sağlayabilirsiniz.
İşte Person sınıfında Yaş özelliğinin nasıl bağlanacağına dair bir örnek:
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
Bağlama İle ObservableCollection Kullanma
Binding age'ı bir kullanıcı arayüzü öğesine bağlamayı, yaş değerini güncellemeyi ve koleksiyondaki değişikliklerin nasıl yansıtıldığını gözlemlemeyi gösterelim:
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()
IronPDF ile PDF Oluşturma
Artık ObservableCollection'ı ayarlayıp olay işleyicilerine ekledikten sonra, dinamik kişi koleksiyonunu yansıtan bir PDF oluşturma zamanı geldi.
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
Örnek İki: ObservableCollection'dan PDF Faturası oluşturma
İşte IronPDF kullanarak bir fatura öğeleri ObservableCollection'ından PDF oluşturmanın bir örneği:
Adım 1: Örnek Fatura Öğe Sınıfı
Bu sınıf, ürün adı, miktar, fiyat ve toplam fiyat için özellikleri olan faturadaki bir öğeyi temsil eder.
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
Adım 2: Örnek ObservableCollection
Bu örnek, birkaç fatura öğesi içeren bir ObservableCollection başlatır. Bu koleksiyondaki öğeleri dinamik olarak ekleyebilir, kaldırabilir veya değiştirebilirsiniz.
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
}
}
Adım 3: IronPDF ile PDF Oluşturma
Burada PDF'yi oluşturmak için bir fonksiyon oluşturuyoruz. Bu fonksiyon, ObservableCollection'daki verileri kullanır ve IronPDF kullanılarak PDF olarak oluşturulan HTML'ye dönüştürür.
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
Adım 4: CollectionChanged Etkinliğine Abone Olma
ObservableCollection değişiklikleri otomatik olarak bildirdiğinden, koleksiyon güncellendiğinde PDF'yi yeniden oluşturmak kolaydır. Örneğin, bir öğe eklendiğinde veya kaldırıldığında, güncellenmiş verilerle PDF'yi yeniden oluşturabilirsiniz.
İşte CollectionChanged olayına nasıl abone olunabileceği ve koleksiyon değiştiğinde PDF'nin nasıl yeniden oluşturulabileceği:
// 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
Adım 5: Öğeleri Ekleme ve Test Etme
ObservableCollection'a yeni öğeler ekleyerek ve PDF'nin otomatik olarak nasıl yeniden oluşturulduğunu gözlemleyerek şimdi test edebilirsiniz.
// 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
})
Tam Kod Örneği
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
Çıktı

Kodun Yaptığı
- InvoiceItem class: Ürün Adı, Miktar, Fiyat ve hesaplanmış Toplamı için özelliklere sahip bir fatura öğesini temsil eder.
- ObservableCollection: Fatura öğelerinin listelendiği yer. Koleksiyon herhangi bir değişikliği dinleyicilere otomatik olarak bilgi verir (örn., öğeler eklendiğinde veya kaldırıldığında).
- GenerateInvoicePDF: Bu yöntem, faturayı temsil eden HTML içeriğini oluşturur ve IronPDF'yi kullanarak PDF'ye dönüştürür.
- CollectionChanged: Koleksiyon değiştiğinde PDF'yi yeniden oluşturmak için ObservableCollection olayını işler, böylece PDF üretimi dinamik hale gelir.
- Testing: Ana yöntem, ObservableCollection'a öğeler eklenip kaldırıldığında PDF'nin yeniden üretimini nasıl tetiklediğini gösterir.
Performans Dikkat Edilecek Hususlar
Büyük Koleksiyonları Yönetme
Büyük ObservableCollection örnekleriyle çalışırken, performans bir endişe kaynağı haline gelebilir. Koleksiyon değiştikçe PDF'nin her seferinde yeniden üretilmesi, çok sayıda öğe varsa kaynak yoğun olabilir. Bunu azaltmak için, güncellemeleri toplamak veya PDF üretim sürecini aşırı yüklememek için sayfalama gibi teknikler kullanmayı düşünün.
Verimli PDF İşleme
PDF işlemesinin verimli olmasını sağlamak için, aşağıdaki ipuçlarını aklınızda bulundurun:
- Gereksiz yeniden işleme işlemlerini minimize edin: PDF'yi yalnızca veri önemli ölçüde değiştiğinde (örn., öğe eklendiğinde veya kaldırıldığında) yeniden oluşturun.
- Tablo düzenini optimize edin: Büyük veri kümeleri işlenirken, bunları daha küçük ve daha yönetilebilir bölümlere ayırarak işleme süresini iyileştirin.
- Önbellek kullanın: Statik veya seyrek değişen veriler için önceden üretilmiş PDF'leri önbelleğe alın.
Sonuç
C#'ın ObservableCollection'ı ile IronPDF'yi birleştirerek, uygulamanızın verilerindeki gerçek zamanlı değişiklikleri yansıtan dinamik PDF'ler oluşturabilirsiniz. İster fatura, rapor, isterse başka belgeler üretirken, bu yaklaşım alttaki koleksiyon değiştiğinde PDF içeriğinin otomatik olarak güncellenmesine olanak tanır.
ObservableCollection entegrasyonu, uygulamanızın minimum çabayla her zaman güncel olmasını sağlarken, IronPDF yüksek kaliteli PDF'leri oluşturmanın tüm ağır işlerini üstlenir. Bu makalede tartışılan en iyi uygulama ve performans ipuçlarını takip ederek, .NET uygulamalarınız için kesintisiz bir PDF üretim deneyimi yaratabilirsiniz.
IronPDF'yi kendiniz denemek ister misiniz? C# PDF projelerinizi yükseltmek için bugün ücretsiz deneme sürümünü indirin ve bu kütüphaneyi daha fazla eylemde görmek için geniş kapsamlı dokümantasyon bölümünü incelemeyi unutmayın.
Sıkça Sorulan Sorular
C#'de ObservableCollection nedir?
ObservableCollection, C#'da INotifyCollectionChanged arayüzünü uygulayan bir sınıftır. Öğeler eklendiğinde, çıkarıldığında veya değiştirildiğinde bildirimlerde bulunur, bu da gerçek zamanlı güncellemelerin gerektiği UI uygulamalarında veri bağlama için ideal hale getirir.
C#'de dinamik veriden PDF nasıl oluşturabilirim?
IronPDF kullanarak, C#'ın ObservableCollection sınıfını kullanarak dinamik verilerden PDF oluşturabilirsiniz. Koleksiyon güncellendikçe, mevcut veri durumunu yansıtmak için PDF'yi otomatik olarak yeniden oluşturabilirsiniz.
PDF oluşturulurken ObservableCollection kullanımının faydaları nelerdir?
ObservableCollection, canlı veri değişikliklerini yansıtan PDF'ler üretirken gerçek zamanlı veri takibi sağlar. IronPDF ile birleştirildiğinde, veri güncellemelerinin PDF çıktısında anında yansıtılmasını sağlar.
C#'de bir PDF'ye ObservableCollection'dan veri nasıl bağlanır?
ObservableCollection'dan PDF'ye veri bağlamak için koleksiyon öğeleri üzerinde döngü yapabilir ve bunları tablolar veya listeler gibi yapılandırılmış öğeler olarak PDF'ye eklemek için IronPDF'in yöntemlerini kullanabilirsiniz. Bu, PDF içeriğinin her zaman veriyle senkronize olmasını sağlar.
C#'de ObservableCollection ile PDF oluşturmanın yaygın bir kullanım durumu nedir?
Yaygın bir kullanım durumu, bir ObservableCollection öğelerinden fatura oluşturmaktır. Koleksiyona öğeler eklenip çıkarıldıkça, PDF faturası mevcut öğe listesini doğru bir şekilde yansıtmak için yeniden oluşturulabilir ve böylece güncel belgeler sağlanmış olur.
IronPDF, C#'de HTML'den PDF'ye dönüşümü nasıl gerçekleştirir?
IronPDF, RenderHtmlAsPdf ve RenderHtmlFileAsPdf gibi yöntemler kullanarak HTML'yi PDF'ye dönüştürebilir. Bu, geliştiricilerin web sayfalarından veya HTML stringlerinden PDF'ler oluşturmasına olanak tanır ve dinamik içerik render'ini kolaylaştırır.
PDF oluşturulurken büyük ObservableCollection'larla çalışırken nelere dikkat edilmelidir?
Büyük koleksiyonlarla ilgilenirken, sayfa numaralandırmayı kullanmayı, güncellemeleri bölmeyi ve performans sorunlarını önlemek için düzeni optimize etmeyi düşünün. IronPDF'in önbellekleme ve render optimizasyonları da büyük verileri verimli bir şekilde yönetmeye yardımcı olabilir.
IronPDF, .NET uygulamalarında verimliliği nasıl artırabilir?
IronPDF, ayrıntılı düzen özelleştirme, HTML'den PDF'ye dönüşüm ve çeşitli veri kaynaklarıyla entegrasyon gibi PDF oluşturmak için sağlam özellikler sunarak verimliliği artırır. Karmaşık PDF görevlerini basitleştirerek, geliştiricilerin temel uygulama mantığına odaklanmasına olanak tanır.




