عمل تقرير لعرض سجل معين – 2

18 08 2008

في المرة الماضية عندما طرحت التدوينة : عمل تقرير لعرض سجل معين ذكرت طريقة حل تلك المشكلة باستخدام الباراميترات ، البعض قد يستصعبها ، والبعض قد يسأل من منظور تحسين الكفاءة : لماذا نقوم بتحميل البيانات في الذاكرة ( قد تكون بالآلاف ) طول وقت عرض التقرير  بينما نحن نحتاج الى سجل واحد فقط ؟ سؤال جميل جدا بل مهم واعتقد ان من يسال سؤال كهذا هو من المبرمجين الذين يهمهم ان يعمل برنامجهم بأقل ثقل على الذاكرة .


الطريقة الأخرى اسهل اذا اردنا مجرد عرض سجل واحد فقط ، وهي عمل Filter للبيانات في مصدر التقرير قبل ان تصل التقرير، طبعا بمجرد قيامك بإضافة اداة ReportViewer وتحديد تقرير معين موجود في المشروع سيتم اضافة عدة ادوات تلقائيا الى النافذة منها Dataset,TableAdapter,bindingSource ، فعملية الوصول الى مصدر البيانات من خلال الكود سهله جدا .

الفكرة هنا اننا سنقوم بعمل كائن DataView نستخدمه في فلترة البيانات حسب الحقل المميز للمصدر والذي يكون في العادة ID ، بعد ذلك نقوم بحذف كائن الـ ReportDataSource الخاص بالكائن ReportViewer.LocalReport ، ونضيف كائن جديد نعمله بانفسنا .

في حالتي استخدم الجدول Employees من قاعدة البيانات Northwind ولدي Dataset بالإسم EmployeesDataset وفي التقرير مصدر البيانات DataSource اسمه EmployeesDataset_Employees ،وقد اضفت الى النافذة المطلوبة شريط ادوات ToolStrip به أداة Label,TextBox,Button ليقوم المستخدم بإدخال الـ ID ،

بالنسبه للكود ، فقد قمت بحذف السطر التالي من الحدث Load للنافذة :

رمز:

Me.ReportViewer1.RefreshReport()

ثم قمت بإستيراد فضاء الأسماء :

رمز:

Imports Microsoft.Reporting.WinForms

وفي حدث النقر Click للزر المدعو tsbtnshowReport :

‘adding new ReportDataSource objectDim DS AsNew ReportDataSource

‘making new DataViewObject to get the data and filter it

Dim FilteredData AsNew DataView(Me.EmployeesDataSet.Employees)

‘filtering the data by ID

FilteredData.RowFilter = “ID = “ & Me.tstxtID.Text

’setting the name and value properties of the

‘ReportDataSource Object

DS.Name = “EmployeesDataSet_Employees”

DS.Value = FilteredData

‘Removing the current Datasources of the report

ReportViewer1.LocalReport.DataSources.RemoveAt(0)

‘adding the new report DataSource object

ReportViewer1.LocalReport.DataSources.Add(DS)

‘Viewing the data on the ReportViewer

Me.ReportViewer1.RefreshReport()

 


وقد وضعت تعليقات توضح الكود جيدا ، الفكرة في الكود اننا قمنا بعمل Replace لكائن الـ ReportDataSource بآخر جديد تم اعطاؤه سجل واحد فقط One Row Only لذلك سيتم عرض سجل واحد فقط على التقرير

في الرابط التالي المثال كاملا

تحياتي


الإجراءات

معلومات

أضف تعليق