24-10-12, 12:33 AM
وجدت الحل والحمد لله , كمايلي :
من Add new Items نضيف DataSet نسميها DataSet_A ونفتحها بوضع التصميم ونضيف اليها DataTable نسميه Table1
ثم نضيف له الحقول بحيث تكون نفس حقول الجدول بقاعدة البيانات (واذا كان هناك اكثر من جدول .. ننشئ اكثر من DataTable )
ولاننسى لكل حقل ان نضع نوع البيانات ويفضل نفس تصميم جدول قاعدة البيانات .
ملاحظة : الداتاسيت هنا هي مجرد صورة فارغة عن قاعدة البيانات , وذلك لكي نربطها بالتقرير ليأخذ التقرير حقوله منها
.......
ثم نضيف التقرير CrystalReport1 وعند مرحلة مصدر البيانات .. نختار Project Data ثم من ADO.net Datasets نجد اسم الجدول Table1 فنختاره .
...
نضيف Class1 نعرف بها: الاتصال Con - و rpt من CrystalReport1 الذي سيكون المصدر للـ CrystalReportViewer1- نضع بالكلاس ايضا دوال بعدد التقارير التي نريدها .. بحيث كل دالة تجهز المتغير rpt ببيانات مختلفة .
بالفورم الاول نضع أزرار Buttons ايضا بعدد التقارير التي نريدها , بحيث اذا نقرنا على الزر الاول (مثلا) سيقوم بعرض الفورم الثاني الذي يحوي الـ CrystalReportViewer1 وهي بدورها تقوم بعرض التقرير الاول .
ولكن كيف نحدد لها أي زر تم ضغطه من الفورم الاول ( ونحن في الفورم الثاني)
هنا نحتاج متغير عام للـ Solution نقوم بتعريفه بمنطقة الاعدادات Settings كما يلي :
نضغط باليمين على اسم الـ Solution ونختار خصائص , نختار البند Settings
يظهر جدول نضيف له المتغير وليكن X :
name: X
Type: int
scope: user
value: 0
ونحفظ .
نذهب لحدث النقر على الزر الاول ( بالفورم الاول ) ونكتب به مايلي : حيث App1 اسم الـ Solution :
في حدث النقر على الزر الثاني نفس الكود السابق ولكن بدل الواحد نضع 2
وهكذا الازرار الاخرى اذا كان لدينا اكثر من تقريرين..
ثم نذهب للفورم الثاني وبحدث تحميل الفورم Form2_Load نكتب :
حيث SetRpt2 , SetRpt هي دوال الكلاس Class1 والتي تقوم بتجهيز المتغير rpt ليحمل بيانات محددة ( كما نريد ) من قاعدة البيانات , وكل دالة تم انشاؤها من أجل تقرير مختلف .
أرفقت المثال كاملا (سي شارب - فيجوال ستوديو 10 )
من Add new Items نضيف DataSet نسميها DataSet_A ونفتحها بوضع التصميم ونضيف اليها DataTable نسميه Table1
ثم نضيف له الحقول بحيث تكون نفس حقول الجدول بقاعدة البيانات (واذا كان هناك اكثر من جدول .. ننشئ اكثر من DataTable )
ولاننسى لكل حقل ان نضع نوع البيانات ويفضل نفس تصميم جدول قاعدة البيانات .
ملاحظة : الداتاسيت هنا هي مجرد صورة فارغة عن قاعدة البيانات , وذلك لكي نربطها بالتقرير ليأخذ التقرير حقوله منها
.......
ثم نضيف التقرير CrystalReport1 وعند مرحلة مصدر البيانات .. نختار Project Data ثم من ADO.net Datasets نجد اسم الجدول Table1 فنختاره .
...
نضيف Class1 نعرف بها: الاتصال Con - و rpt من CrystalReport1 الذي سيكون المصدر للـ CrystalReportViewer1- نضع بالكلاس ايضا دوال بعدد التقارير التي نريدها .. بحيث كل دالة تجهز المتغير rpt ببيانات مختلفة .
بالفورم الاول نضع أزرار Buttons ايضا بعدد التقارير التي نريدها , بحيث اذا نقرنا على الزر الاول (مثلا) سيقوم بعرض الفورم الثاني الذي يحوي الـ CrystalReportViewer1 وهي بدورها تقوم بعرض التقرير الاول .
ولكن كيف نحدد لها أي زر تم ضغطه من الفورم الاول ( ونحن في الفورم الثاني)
هنا نحتاج متغير عام للـ Solution نقوم بتعريفه بمنطقة الاعدادات Settings كما يلي :
نضغط باليمين على اسم الـ Solution ونختار خصائص , نختار البند Settings
يظهر جدول نضيف له المتغير وليكن X :
name: X
Type: int
scope: user
value: 0
ونحفظ .
نذهب لحدث النقر على الزر الاول ( بالفورم الاول ) ونكتب به مايلي : حيث App1 اسم الـ Solution :
كود :
[align=left][SIZE=5][align=left] App1.Properties.Settings.Default.X = 1;
App1.Properties.Settings.Default.Save();[/align][/SIZE][/align]في حدث النقر على الزر الثاني نفس الكود السابق ولكن بدل الواحد نضع 2
وهكذا الازرار الاخرى اذا كان لدينا اكثر من تقريرين..
ثم نذهب للفورم الثاني وبحدث تحميل الفورم Form2_Load نكتب :
كود :
[SIZE=5][align=left]
private void Form2_Load(object sender, EventArgs e)
{
Class1 cls = new Class1();
if (App1.Properties.Settings.Default.X == 1)
{
cls.SetRpt();
crystalReportViewer1.ReportSource = cls.rpt;
}
else
if (App1.Properties.Settings.Default.X == 2)
{
cls.SetRpt2();
crystalReportViewer1.ReportSource = cls.rpt;
}
}[/align][/SIZE]أرفقت المثال كاملا (سي شارب - فيجوال ستوديو 10 )
