ایجاد گزارش چاپی (Print Preview) در Windows Forms و #C
در محیط توسعه Windows Forms با زبان برنامهنویسی C#، ابزارهای داخلی قدرتمندی برای مدیریت فرآیند چاپ، از جمله پیشنمایش چاپ، ارائه شده است.
اجزای اصلی فرآیند چاپ در Windows Forms
برای پیادهسازی صحیح قابلیت پیشنمایش چاپ، نیاز به استفاده از سه جزء اصلی از فضای نام System.Drawing.Printing و System.Windows.Forms داریم:
۱. PrintDocument (محتوا ساز)
PrintDocument کلاس اصلی و هسته فرآیند چاپ است. این شیء نمایانگر سندی است که قرار است چاپ شود. وظیفه اصلی آن تولید محتوای چاپی (مانند ترسیم متن، خطوط و تصاویر روی صفحه مجازی) و مدیریت چرخههای چاپ (مانند آمادهسازی، شروع چاپ، و انتقال به صفحه بعدی) است.
رویداد کلیدی:
-
PrintPage: این رویداد مهمترین بخش است که هر بار برای ترسیم محتوای یک صفحه فراخوانی میشود. توسعهدهنده باید در این رویداد، کد لازم برای رسم عناصر گرافیکی مورد نظر بر روی آبجکت Graphics فراهم شده توسط رویداد را بنویسد.
۲. PrintPreviewDialog (نمایش دهنده استاندارد)
PrintPreviewDialog یک کنترل دیالوگ (پنجره) آماده و استاندارد ویندوز است که محتوای تولید شده توسط یک شیء PrintDocument را به کاربر نمایش میدهد. این دیالوگ امکانات پیشفرض مانند بزرگنمایی (Zoom)، حرکت بین صفحات (Next/Previous Page)، و دسترسی مستقیم به دکمه چاپ نهایی را در اختیار کاربر قرار میدهد.
نکات کلیدی:
-
مدل دیالوگ (Dialog Model): این کنترل به صورت یک پنجره جداگانه (Modally) باز میشود و پس از پایان کار بسته میشود.
-
اتصال به PrintDocument: برای نمایش محتوا، باید خاصیت Document این کنترل به شیء PrintDocument مورد نظر متصل شود.
-
فراخوانی: با استفاده از متد ShowDialog() فراخوانی میشود.
۳. PrintPreviewControl (نمایش دهنده قابل تعبیه)
این کنترل برخلاف PrintPreviewDialog، یک دیالوگ جداگانه نیست، بلکه یک کنترل قابل تعبیه (Embeddable Control) است که میتوان آن را مستقیماً روی یک فرم یا پنل قرار داد. این امکان، انعطافپذیری بیشتری در طراحی رابط کاربری (UI) پیشنمایش چاپی سفارشیشده به توسعهدهنده میدهد. این کنترل هم برای نمایش محتوا باید به یک شیء PrintDocument متصل شود.
نحوه پیادهسازی Print Preview با PrintPreviewDialog
در این بخش، مراحل گام به گام پیادهسازی یک پیشنمایش چاپ ساده با استفاده از PrintPreviewDialog را بررسی میکنیم.
گام ۱: آمادهسازی کنترلها
یک فرم ویندوز جدید ایجاد کرده و کنترلهای زیر را از Toolbox به آن اضافه کنید:
-
Button: برای فراخوانی پیشنمایش (مثلاً با نام btnPrintPreview).
-
PrintDocument: کنترلی نامرئی که به Component Tray اضافه میشود (مثلاً با نام printDocument1).
-
PrintPreviewDialog: کنترلی نامرئی که به Component Tray اضافه میشود (مثلاً با نام printPreviewDialog1).
گام ۲: اتصال PrintDocument به PrintPreviewDialog
در بخش طراحی، خاصیت Document کنترل printPreviewDialog1 را به printDocument1 تنظیم کنید. این کار به دیالوگ میگوید که برای نمایش محتوا، از کدام سند چاپی استفاده کند.
گام ۳: تعریف محتوای چاپی (رویداد PrintPage)
مهمترین گام، تعریف محتوایی است که قرار است در هر صفحه چاپ شود. این کار با استفاده از رویداد PrintPage در شیء printDocument1 انجام میشود.
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
// شیء گرافیکی برای ترسیم محتوا
Graphics g = e.Graphics;
// تعریف فونت و قلم
Font titleFont = new Font("Arial", 16, FontStyle.Bold);
Font normalFont = new Font("Arial", 12);
SolidBrush blackBrush = new SolidBrush(Color.Black);
// مختصات شروع ترسیم
int x = e.MarginBounds.Left;
int y = e.MarginBounds.Top;
int lineHeight = normalFont.Height + 5;
// ترسیم عنوان
string title = "گزارش آزمایشی Windows Forms";
g.DrawString(title, titleFont, blackBrush, x, y);
y += lineHeight * 2; // اضافه کردن فاصله
// ترسیم محتوای متنی
string content1 = "این یک خط محتوای آزمایشی برای نمایش پیشنمایش چاپ است.";
g.DrawString(content1, normalFont, blackBrush, x, y);
y += lineHeight;
string content2 = $"تاریخ و زمان: {DateTime.Now.ToString()}";
g.DrawString(content2, normalFont, blackBrush, x, y);
y += lineHeight;
// **مدیریت صفحات:**
// اگر نیاز به چاپ صفحات بیشتری است:
// e.HasMorePages = true;
// در غیر این صورت (برای پایان):
e.HasMorePages = false;
}
نکته: در کد بالا، e.MarginBounds محدودهای از صفحه را که توسط حاشیههای پیشفرض تعیین شده است، در اختیار قرار میدهد. برای ترسیم عناصر گرافیکی یا متن، باید از متدهای شیء Graphics مانند DrawString، DrawLine یا DrawImage استفاده کرد.
گام ۴: فراخوانی Print Preview
در نهایت، کد مربوط به کلیک دکمه btnPrintPreview را برای نمایش دیالوگ پیشنمایش مینویسیم:
private void btnPrintPreview_Click(object sender, EventArgs e)
{
// اطمینان از اتصال Document به printPreviewDialog1 و فراخوانی ShowDialog
if (printPreviewDialog1.Document == null)
{
printPreviewDialog1.Document = printDocument1; // اگر اتصال در دیزاین انجام نشده باشد
}
printPreviewDialog1.ShowDialog();
}
سفارشیسازی و مدیریت گزارشهای پیچیده
برای گزارشهای حرفهای و پیچیدهتر، نیاز به مدیریت دقیقتر چیدمان، جداول، و صفحات وجود دارد:
۱. مدیریت خودکار صفحات (Pagination)
در رویداد PrintPage، اگر محتوای یک صفحه به پایان رسید اما دادههای بیشتری برای چاپ وجود داشت، باید خاصیت e.HasMorePages را برابر با true قرار داد. این کار باعث میشود تا PrintDocument مجدداً رویداد PrintPage را برای صفحه بعدی فراخوانی کند. توسعهدهنده باید در هر بار فراخوانی PrintPage، وضعیت جاری (مثلاً اینکه در حال چاپ کدام سطر از یک جدول داده است) را ذخیره و مدیریت کند تا چاپ از محل توقف صفحه قبل ادامه یابد.
۲. تنظیمات چاپ
کنترلهای مرتبط دیگری نیز در اختیار هستند که امکان تنظیمات چاپ را فراهم میکنند:
-
PrintDialog: برای انتخاب چاپگر، تعداد نسخهها، و محدوده صفحات قبل از چاپ نهایی.
-
PageSetupDialog: برای تنظیم حاشیههای صفحه، اندازه کاغذ و جهتگیری (عمودی/افقی).
۳. استفاده از ابزارهای گزارشگیری تخصصی
اگرچه ابزارهای داخلی Windows Forms برای چاپهای ساده و مستقیم کافی هستند، اما برای گزارشهای دادهمحور، ساختاریافته و پیچیده (مانند جدولهای پویا، گروهبندی دادهها، و نمودارها) بهتر است از ابزارهای گزارشگیری تخصصی مانند Microsoft Report Viewer یا Crystal Reports استفاده شود. این ابزارها قالبهای گزارش را از منطق نمایش جدا کرده و قابلیت پیشنمایش و چاپ با کیفیت بالا را به صورت آماده در اختیار میگذارند.
خلاصه
قابلیت پیشنمایش چاپ (Print Preview) در Windows Forms با استفاده از کنترلهای داخلی PrintDocument و PrintPreviewDialog به سادگی قابل پیادهسازی است. PrintDocument مسئول تولید محتوا در رویداد PrintPage بوده و PrintPreviewDialog وظیفه نمایش استاندارد آن محتوا را بر عهده دارد، در حالی که e.Graphics ابزار اصلی ترسیم محتوا است. این ابزارها قدرت کافی برای ایجاد گزارشهای ساده تا متوسط را فراهم میکنند و با مدیریت صحیح منطق صفحه بندی (Pagination)، میتوانند برای انواع نیازهای چاپی مورد استفاده قرار گیرند.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.