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