السلام عليكم و رحمة الله و بركاته
سأحاول ان أقدم شرحا بسيطا إلي كيفية طباعة تقرير في سي شارب 2.0 بدون الاعتماد على crystal reports و إنما باستغلال امكانيات GDI+ فقط. من منطلق أن التعامل مع تقنيات اكبر يتطلب التعرف على الأساسيات
إن أكثر التطبيقات التجارية تتعامل باستعمال الصوت و الصورة و الطباعة و انه من المستحيل إن يعتبر البرنامج نفسه محترما إذا لم يعط المستخدم الإمكانية لطباعة نتائج عمله بصورة بسيطة و سريعة. ما يعاب على منصة ميكروسوفت إنها وفرت إمكانيات جيدة للتعامل مع الصورة ثنائية البعد و طباعة التقارير لكنها تجاهلت التعامل مع عمليات الطباعة (print jobs), الصوت و الصورة مما يجبر المبرمج ان يقفز ابعد من ذلك و يتعامل مباشرة مع دوال لويندوز win32.
في هذا الدرس سأحاول أن اشرح عدة نقاط
1- عملية اكتشاف آلات الطباعة المثبتة
إذا أردنا أن نتعرف على الطابعات المرتبطة بالنظام فإننا سوف تحتاج أن نستدعي
System.Drawing.Printing.PrinterSettings
توفر هذه الفئة معلومات كاملة حول جميع آلات الطباعة المرتبطة مع الحاسوب عن طريق قراءة المعلومات من المجموعة (collection) InstalledPrinters كما تحتوي على عدة معلومات عن حجم الورقة الممكن استعماله. دقة الطباعة الخ الخ....
و الآن لنحاول أن نكتب أول برنامج لنا للتعرف على الطابعات الموجودة
كم بإنشاء مشروع جديد و ضع غلى النافذة Form مكون ListBox
لنتجه إلى حدث ظهور النافذة و نكتب اكوادنا فيه
private void Form1_Load(object sender, EventArgs e)
{
foreach (string printerName in PrinterSettings.InstalledPrinters) {
listBox1.Items.Add(printerName);
}
}نص الكود بسيط جدا حيث يقوم فقط بالقراءة من المجموعة InstalledPrinters و يظهر النتيجة على ال listBox1.
تنفيذ البرنامج في حاسوبي اظهر الناتج التالي
كما ترون فان الطابعة الوحيدة المثبتة على هته الالة هي Microsoft XPS Document Writer و التي لا ادري ما عملها هههههه
و الان لننتفل الى كتابة اجراء اخر
عندما نضغط على listBox1 فان حدث من نوع OnClick سوف يفجر من طرف البرنامج.. لنستفد منه
private void listBox1_Click(object sender, EventArgs e)
{
CurrentPrinter = listBox1.SelectedItem.ToString();
}هكذا فاننا من المستحيل ان نرسل الصنف PrinterSettings اسم طابعة فارغ
قم الان باضافة مكون شجرة TreeView و زر ....
و اكتب التالي في حدث الضغط على الزر
private void button1_Click(object sender, EventArgs e)
{
treeView1.Nodes.Clear();
PrinterSettings printer = new PrinterSettings();
printer.PrinterName = CurrentPrinter;
if (printer.IsValid == true) {
TreeNode resNode = new TreeNode("Resolutions:");
treeView1.Nodes.Add(resNode);
foreach(PrinterResolution printerResolution in printer.PrinterResolutions){
resNode.Nodes.Add(printerResolution.ToString());
}
TreeNode paperNode = new TreeNode("Paper Sizes:");
treeView1.Nodes.Add(paperNode);
foreach (PaperSize paperSize in printer.PaperSizes) {
paperNode.Nodes.Add(paperSize.ToString());
}
TreeNode paperSourceNode = new TreeNode("Paper Sources:");
treeView1.Nodes.Add(paperSourceNode);
foreach (PaperSource paperSource in printer.PaperSources)
{
paperSourceNode.Nodes.Add(paperSource.ToString());
}
}
}الناتج سوف يكون مثير و مريح جدا :lol:
بعد أن تعرفنا على كيفية استخراج معلومات الطابعة فإننا سنحاول أن ننتج أول برنامج لنا يقوم بطباعة نص تجريبي على ورقة
قم بانجاز مشروع جديد و ضع مكون نص و زر
طباعة صفحة على الطابعة تتطلب التعامل مع الصنف PrintDocument لكنه لا يأتي مجهزا بكل شيئ للاسف. سوف تضطر الى كتابة حدث يقوم بطباعة النص ثم ربطه معه. اعرف انك سوف تتذمر و تقول لماذا على ان اكتب الكود بنفسي لكن هذه الطريقة سوف تعطيك مهارة كبيرة في التعامل مع جميع المكونات المرئية و تسهيل عملية طباعة التقارير مباشرة من DataGrid او DataGridView بدون اللجوء الى CrystalReport و التي لحد الان لم استطع ان افهمها هههههه.
لنكتب حدث الضغط على الزر
private void button1_Click(object sender, EventArgs e)
{
PrintDocument document = new PrintDocument();
document.PrintPage +=this.PrintPage;
PrintDialog printDlg = new PrintDialog();
printDlg.Document = document;
if (printDlg.ShowDialog() == DialogResult.OK)
{
document.Print();
}
}انتبه الى السطرين البرمجيين التاليين
PrintDocument document = new PrintDocument(); document.PrintPage +=this.PrintPage;
قمنا بانشاء عنصر من الصنف PrintDocument سميناه document ثم فمنا بربط الحدث PrintPage للعنصر document بحدث من انتاجنا سميناه PrintPage.
لنر الحدث الذي اضفناه:
private void PrintPage(object sender, PrintPageEventArgs e)
{
using(Font font = new Font("Lucida Console",30))
{
e.Graphics.DrawString(textBox1.Text,
font,
Brushes.Blue,
e.PageBounds.Left,
e.PageBounds.Top);
}
}هه بسيط اليس كذلك... الا تلاحظ ان التعامل سوف يصبح مباشرا عن طريق دوال GDI+ مثل حالتنا حين نطبع جملة نصية مأخوذة مباشرة من textBox1
في المرة القادمة سوف نضيف امكانية طباعة معلومات مباشرة من قاعدة بيانات ... و السلام عليكم و رحمة الله و بركاته