فیلتر کردن اطلاعات در ریپورت ویوور

tiradan

New Member
سلام دوستان

چگونه میشه با استفاده از مقدار یک تکست باکس اطلاعات درون یک ریپورت رو فیلتر کرد؟؟؟

با تشکر
 

the_king

مدیرکل انجمن
سلام دوستان

چگونه میشه با استفاده از مقدار یک تکست باکس اطلاعات درون یک ریپورت رو فیلتر کرد؟؟؟

با تشکر

اون ReportViewer به یک BindingSource متصله، اون BindingSource هم داده ها رو توسط یک DataAdapter خوانده. داده ها داخل یک یا چند DataTable
خوانده میشه. برای خوانده اطلاعات یک دستور Select ئه SQL بکار رفته که بصورت پیشفرض شامل همه رکورد ها است.
اگه کد داخل Form1_Load رو ببینید بصورت خودکار یک نمونه TableAdapter.Fill نوشته شده که این دستور Select رو اجرا می کنه. DataTable ای که
داده ها داخلش خونده میشه داخل پارانتز نوشته شده. فرضا My_DatabaseDataSet.Table_1
حالا شما می توانید هر دستور Select دیگری رو با توجه به مقدار داخل TextBox تون روی اون DataAdapter بکار ببرید و اون DataTable رو پر کنید.
تا اینجا DataTable پر شده اما ReportViewer متوجه این اتفاق نمیشه، پس در ادامه یک متد RefreshReport هم روی ReportViewer اجرا کنید تا Refresh بشه.
 

tiradan

New Member
کد

اون ReportViewer به یک BindingSource متصله، اون BindingSource هم داده ها رو توسط یک DataAdapter خوانده. داده ها داخل یک یا چند DataTable
خوانده میشه. برای خوانده اطلاعات یک دستور Select ئه SQL بکار رفته که بصورت پیشفرض شامل همه رکورد ها است.
اگه کد داخل Form1_Load رو ببینید بصورت خودکار یک نمونه TableAdapter.Fill نوشته شده که این دستور Select رو اجرا می کنه. DataTable ای که
داده ها داخلش خونده میشه داخل پارانتز نوشته شده. فرضا My_DatabaseDataSet.Table_1
حالا شما می توانید هر دستور Select دیگری رو با توجه به مقدار داخل TextBox تون روی اون DataAdapter بکار ببرید و اون DataTable رو پر کنید.
تا اینجا DataTable پر شده اما ReportViewer متوجه این اتفاق نمیشه، پس در ادامه یک متد RefreshReport هم روی ReportViewer اجرا کنید تا Refresh بشه.


ممنون. اما خوب نحوه انجام این کارو نمیدونم. چجوری و چگونه مقدار textbox رو به ریپورت پاس بدم که دیتا ها رو فیلتر کنه؟؟؟
البته راهی که بنده استفاده کردم و خوب جواب نداد اینه:
کد:
        Dim id(0) As ReportParameter
        Dim nm(0) As ReportParameter
        Dim fnm(0) As ReportParameter
        Dim miani(0) As ReportParameter
        Dim payan(0) As ReportParameter
        Dim nahaei(0) As ReportParameter
        Dim i As Integer
     
        id(0) = New ReportParameter("id", Table1DataGridView.Item(0, i).Value.ToString)
        nm(0) = New ReportParameter("nm", Table1DataGridView.Item(1, i).Value.ToString)
        fnm(0) = New ReportParameter("fnm", Table1DataGridView.Item(2, i).Value.ToString)
        miani(0) = New ReportParameter("miani", Table1DataGridView.Item(3, i).Value.ToString)
        payan(0) = New ReportParameter("payan", Table1DataGridView.Item(4, i).Value.ToString)
        nahaei(0) = New ReportParameter("nahaei", Table1DataGridView.Item(5, i).Value.ToString)
        Me.ReportViewer1.LocalReport.SetParameters(id)
        Me.ReportViewer1.LocalReport.SetParameters(nm)
        Me.ReportViewer1.LocalReport.SetParameters(fnm)
        Me.ReportViewer1.LocalReport.SetParameters(miani)
        Me.ReportViewer1.LocalReport.SetParameters(payan)
        Me.ReportViewer1.LocalReport.SetParameters(nahaei)




       
        Me.ReportViewer1.RefreshReport()

که فقط یه سطر رو تو Table مکررا تکرار میکنه. البته قبلش توسط Text box دیتا هارو تو data grid view سرچ میکنم بعد میخام همونا نمایش داده بشن
نمیدونم چرا فقط یک سطر رو نمایش میده تا آخر

ممنونم اگه دقیق تر راهنماییم کنید
 

the_king

مدیرکل انجمن
ممنون. اما خوب نحوه انجام این کارو نمیدونم. چجوری و چگونه مقدار textbox رو به ریپورت پاس بدم که دیتا ها رو فیلتر کنه؟؟؟
البته راهی که بنده استفاده کردم و خوب جواب نداد اینه:
کد:
        Dim id(0) As ReportParameter
        Dim nm(0) As ReportParameter
        Dim fnm(0) As ReportParameter
        Dim miani(0) As ReportParameter
        Dim payan(0) As ReportParameter
        Dim nahaei(0) As ReportParameter
        Dim i As Integer
     
        id(0) = New ReportParameter("id", Table1DataGridView.Item(0, i).Value.ToString)
        nm(0) = New ReportParameter("nm", Table1DataGridView.Item(1, i).Value.ToString)
        fnm(0) = New ReportParameter("fnm", Table1DataGridView.Item(2, i).Value.ToString)
        miani(0) = New ReportParameter("miani", Table1DataGridView.Item(3, i).Value.ToString)
        payan(0) = New ReportParameter("payan", Table1DataGridView.Item(4, i).Value.ToString)
        nahaei(0) = New ReportParameter("nahaei", Table1DataGridView.Item(5, i).Value.ToString)
        Me.ReportViewer1.LocalReport.SetParameters(id)
        Me.ReportViewer1.LocalReport.SetParameters(nm)
        Me.ReportViewer1.LocalReport.SetParameters(fnm)
        Me.ReportViewer1.LocalReport.SetParameters(miani)
        Me.ReportViewer1.LocalReport.SetParameters(payan)
        Me.ReportViewer1.LocalReport.SetParameters(nahaei)




       
        Me.ReportViewer1.RefreshReport()

که فقط یه سطر رو تو Table مکررا تکرار میکنه. البته قبلش توسط Text box دیتا هارو تو data grid view سرچ میکنم بعد میخام همونا نمایش داده بشن
نمیدونم چرا فقط یک سطر رو نمایش میده تا آخر

ممنونم اگه دقیق تر راهنماییم کنید

به ReportViewer ارسال نکنید، اون ReportParameter ها کاربرد هایی مثل نمایش یک عنوان مشخص یا تغییر در نحوه نمایش گزارش دارند.
اما ربطی به جدول داده هایی که قراره در گزارش نشون داده بشه ندارند، چون خود ReportViewer در فیلتر کردن داده ها دخالتی نداره.
ReportParameter برای این منظور مناسب نیست، فیلتر کردن داده ها رو DataAdapter انجام میده، کاملا مستقل از ReportViewer و ReportParameter هایش.

مثال پیوستی رو ببینید. یک مجموعه داده ای DataSet1 تعریف کرده ام که یک جدول DataTable1 داره، با دو فیلد Model و Company
روی فرم یک DataGridView داریم که قراره کل داده های ما رو نشون بده و یک BindingNavigator هم داره که برای ویرایش کردنش بکار میره.
این DataGridView داده ها رو بصورت کامل نشون میده (بدون فیلتر) و محتویات اش قابل ویرایش است. این محتویات در DataSetA نگهداری میشه و
توسط BindingSourceA به BindingNavigator و DataGridView انتقال داده میشه.

ReportViewer ای هم داریم که قراره داده ها رو بصورت فیلتر شده نشون بده، به همین جهت مستقیما از DataSetA استفاده نمی کنه. یک DataSetB برایش
در نظر می گیریم که فقط داده های فیلتر شده داخلش قرار بگیره و داده ها توسط BindingSourceB به ReportViewer منتقل بشه.
اگر شما در TextBox مورد نظر متنی مثل A یا 4 یا C2 (با حروف بزرگ) بنویسید، فقط سطر هایی از DataSetA در DataSetB کپی می شوند که اون عبارت فیلتر
در فیلد های Company یا Model شون موجود باشه.

مشاهده پیوست FilterForReportViewer.zip
 

tiradan

New Member
به ReportViewer ارسال نکنید، اون ReportParameter ها کاربرد هایی مثل نمایش یک عنوان مشخص یا تغییر در نحوه نمایش گزارش دارند.
اما ربطی به جدول داده هایی که قراره در گزارش نشون داده بشه ندارند، چون خود ReportViewer در فیلتر کردن داده ها دخالتی نداره.
ReportParameter برای این منظور مناسب نیست، فیلتر کردن داده ها رو DataAdapter انجام میده، کاملا مستقل از ReportViewer و ReportParameter هایش.

مثال پیوستی رو ببینید. یک مجموعه داده ای DataSet1 تعریف کرده ام که یک جدول DataTable1 داره، با دو فیلد Model و Company
روی فرم یک DataGridView داریم که قراره کل داده های ما رو نشون بده و یک BindingNavigator هم داره که برای ویرایش کردنش بکار میره.
این DataGridView داده ها رو بصورت کامل نشون میده (بدون فیلتر) و محتویات اش قابل ویرایش است. این محتویات در DataSetA نگهداری میشه و
توسط BindingSourceA به BindingNavigator و DataGridView انتقال داده میشه.

ReportViewer ای هم داریم که قراره داده ها رو بصورت فیلتر شده نشون بده، به همین جهت مستقیما از DataSetA استفاده نمی کنه. یک DataSetB برایش
در نظر می گیریم که فقط داده های فیلتر شده داخلش قرار بگیره و داده ها توسط BindingSourceB به ReportViewer منتقل بشه.
اگر شما در TextBox مورد نظر متنی مثل A یا 4 یا C2 (با حروف بزرگ) بنویسید، فقط سطر هایی از DataSetA در DataSetB کپی می شوند که اون عبارت فیلتر
در فیلد های Company یا Model شون موجود باشه.

مشاهده پیوست 95236

واقعن ممنون از این ایده ی خوب

اما من با Visual studio 2010 کار میکنم

هنگام convert این پروژ ب خوبی کار نکرد

ممنون میشم اگه نسخه مربوطه رو بذاری
 

the_king

مدیرکل انجمن
واقعن ممنون از این ایده ی خوب

اما من با Visual studio 2010 کار میکنم

هنگام convert این پروژ ب خوبی کار نکرد

ممنون میشم اگه نسخه مربوطه رو بذاری

مشکل مربوط به نسخه Microsoft.ReportViewer.Common و Microsoft.ReportViewer.WinForms است که برای ReportViewer لازمه و در پروژه جزو References ها است.
در Visual Studio 2008 نسخه 9.0 شون به پروژه اضافه میشه که در هنگام تبدیل نسخه به 2010 تغییری نمی کنه و با Visual Studio 2010 سازگار نیست.
در Visual Studio 2010 باید از نسخه 10.0 شون استفاده بشه.

مشاهده پیوست FilterForReportViewer2010.zip
 

tiradan

New Member
مشکل مربوط به نسخه microsoft.reportviewer.common و microsoft.reportviewer.winforms است که برای reportviewer لازمه و در پروژه جزو references ها است.
در visual studio 2008 نسخه 9.0 شون به پروژه اضافه میشه که در هنگام تبدیل نسخه به 2010 تغییری نمی کنه و با visual studio 2010 سازگار نیست.
در visual studio 2010 باید از نسخه 10.0 شون استفاده بشه.

مشاهده پیوست 95271

بسیار ممنونم. عالی کار کرد. فقط یک ایراد داره که موقع خالی بودن break میشه برنامه
 

جدیدترین ارسال ها

بالا