View Full Version : مشكل با نمايش در كريستال
mf_007
پنج شنبه 27 اسفند 1388, 14:19 عصر
من تازه كار با كريستال رو شروع كردم تو گزارشي كه ساختم كل جدول رو نشون مي ده ولي مي خام طبق اون شرطي كه تو sql گزاشتم گزارش رو نشون بده مثلا ركوردهايي كه نام آنها "مصطفي" باشه
DataTable dt=new DataTable() ;
cnn.Open();
SqlCommand cmd2 = new SqlCommand("select * from stu where name='mostafa'", cnn);
cmd2.ExecuteNonQuery();
SqlDataAdapter da = new SqlDataAdapter(cmd2 );
da.Fill(dt);
cnn.Close();
CrystalReport1 sp = new CrystalReport1();
sp.SetDataSource(dt );
crystalReportViewer1.ReportSource = sp;
mn_zandy63
پنج شنبه 27 اسفند 1388, 19:38 عصر
کدی که نوشتی به نظر میاد باید درست کار کنه.
کد و گزارشت رو اینجا بزار یه نیگاه بندازیم شاید مشکلش رو متوجه شدیم.
راستی یه ایراد بیربط داخل کدت هست،
خطوط زیر زیادیه و نیازی نیست بنویسیشون.
cmd2.ExecuteNonQuery();
cnn.Open();
cnn.Close();
mf_007
پنج شنبه 27 اسفند 1388, 21:28 عصر
مشكلم حل شد ولي فقط برا وقتي كه report viewer تو فرم يكم هست. كدهاي اضافي رو هم حذف كردم
وقتي report viewer تو فرم 2 باشه اصلا گزارشا رو نشون نمي ده و مجبورم كل كدهاي مربوط رو تو فرم لود فرم دوم هم بنويسم تا درست كار كنه
ديتا تيبل رو هم از نوع public تعريف مي كنم ولي باز هم درست كار نمي كنه
كد زير تو تو يه button تو فرم يك نوشتم
Form2 a = new Form2();
dt = new DataTable();
SqlCommand cmd2 = new SqlCommand("select * from stu where name='mostafa'", cnn);
SqlDataAdapter da = new SqlDataAdapter(cmd2);
da.Fill(dt);
CrystalReport1 sp = new CrystalReport1();
sp.SetDataSource(dt);
a.Show();
}
و كد زير رو تو فرم 2 نوشتم
Form1 a = new Form1();
crystalReportViewer1.ReportSource =a.sp;
mn_zandy63
پنج شنبه 27 اسفند 1388, 22:00 عصر
متوجه داستان فرم 2 نشدم.
دقیقا چه کدی داخل فرم 2 داری؟
mf_007
پنج شنبه 27 اسفند 1388, 22:21 عصر
تو فرم 2 همين يه تيكه كد رو مي نويسم تو فرم لود
Form1 a = newForm1();
crystalReportViewer1.ReportSource =a.sp;
براي اينكه به شي sp در فرم 1 دسترسي داشته باشم اينطوري نوشتم اگه كدم اشتباست ممنون مي شم كد درست رو برام بنويسيد
mn_zandy63
پنج شنبه 27 اسفند 1388, 22:35 عصر
سلام دوست من
اگه درست متوجه شده باشم، شما برنامت با فرم 1 کارش شروع میشه، یک datatable رو پر میکنی و اون رو به عنوان datasource یک گزارش به نام sp قرار می دی. بعد فرم 2 رو new می کنی و باز می کنی.
در فرم 2، یک instance جدید از فرم 1 میسازی و از sp اون استفاده می کنی.
اگه اینطور نیست صحبتهای بعدی من رو بیخیال شو و بیشتر توضیح بده :چشمک:
ببین دوست من، وقتی که داخل فرم 2 یک instance جدید از فرم 1 میسازی:
Form1 a = newForm1();
این فرم 1 با اون فرم 1 قبلیت که داخلش گزارش رو آماده کردی فرق می کنه، اینا دو تا instance مختلف از کلاس فرم 1 هستند و متغیر های داخلشون یکی نیست.
میتونی همون موقع که فرم 2 رو new می کنی گزارشت رو براش ارسال کنی.
به عنوان مثال بر اساس کد خودت
داخل فرم 2، یک تابع جدید اضافه کن:
public Form2(CrystalReport1 sp)
{
crystalReportViewer1.ReportSource =sp;
}
کد زیر رو داخل همون Button داخل فرم 1 بنویس:
dt = new DataTable();
SqlCommand cmd2 = new SqlCommand("select * from stu where name='mostafa'", cnn);
SqlDataAdapter da = new SqlDataAdapter(cmd2);
da.Fill(dt);
CrystalReport1 sp = new CrystalReport1();
sp.SetDataSource(dt);
Form2 a = new Form2(sp);
a.Show();
اگه جاییش گنگ بود بگو تا بیشتر توضیح بدم.
موفق باشی
mf_007
پنج شنبه 27 اسفند 1388, 22:48 عصر
ممنون درست شد فقط به كد زير ايراد مي گرفت
crystalReportViewer1.ReportSource =a.sp;
كه با كد زير عوض كردم و درست شد
crystalReportViewer1.ReportSource =sp;
با تشكر از شما فقط يه سوال ديگه راه ديگري هم وجود داره تا گزارش رو تو فرم 2 نمايش داد؟
mn_zandy63
پنج شنبه 27 اسفند 1388, 22:57 عصر
بله حق با شماست، اصلاحش کردم.
بله راه های زیادی میشه داشت، بستگی به خودت داره.
باید به یه طریقی گزارش رو به viewer بدی.
الان این شکلی کارت راه میفته. باید دید اصلا چرا گزارش رو داخل فرم 1 میسازی و داخل فرم 2 نمایش می دی؟ چرا مثلا همونجا نمیسازی. یا ممکنه به دلیلی بخوای datatable رو داخل یک کلاس دیگه پر کنی، بعد داخل یک کلاس دیگه گزارش رو بسازی و از datatable کلاس قبلی استفاده کنی.
دقیق تر بگو تا توضیح بیشتری بهت بدم، البته بحث الآنت دیگه به گزارش مربوط نمیشه، بحث سر ارسال پارامتر بین فرم ها و کلاس ها ست، میتونی توی بخش C# هم سوال کنی.
موفق باشی
mf_007
پنج شنبه 27 اسفند 1388, 23:09 عصر
فعلا هدف يادگيري بود كه با كمك شما انجام شد.
وقتي تعداد گزارشها زياد مي شه بهتره ابتدا كوئري مورد نظر نوشته بشه بعد پارامتر مورد نظر به فرم نمايش فرستاده بشه و نوشتن تمام كوئري هاي گزارشها در فرم نمايش درست نيست يا شدني نيست درسته؟
mn_zandy63
پنج شنبه 27 اسفند 1388, 23:19 عصر
بله همینطوره.
موفق باشی دوست من.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.