PDA

View Full Version : سوال: نحوه پرینت دیتا گرید ویو با کریستال ریپورت؟



sobaisobai
سه شنبه 05 مهر 1390, 23:16 عصر
سلام خدمت اساتید برنامه نویس
من یه گرید ویو دارم که میخوام با استفاده از کریستال ریپورت دیتاگرید ویو رو پرینت بگیره
خواهشا راهنمایی کنید

sobaisobai
سه شنبه 05 مهر 1390, 23:41 عصر
دادا من میخوام از دیتاگریدویو پرینت بگیرم.

faravaghi
چهارشنبه 06 مهر 1390, 00:22 صبح
سلام،
اینم پرینت از DataGridView
if (Datagridview1.Rows.Count <= 0)
{
MessageBox.Show(". لطفا جهت چاپ اطلاعات مورد نظر را انتخاب نماييد");
return;
}

DataTable DtReport= new DataTable();
DtReport.Columns.Add("orderNumber", typeof(string));
DtReport.Columns.Add("orderName", typeof(string));
DtReport.Columns.Add("address", typeof(string));
DtReport.Columns.Add("registerDate", typeof(string));

for (int i = 0; i < Datagridview1.Rows.Count ; i++)
{
string[] DGridReport = new string[] {
Datagridview1.Rows[i].Cells[0].Value.ToString()
,Datagridview1.Rows[i].Cells[1].Value.ToString()
,Datagridview1.Rows[i].Cells[2].Value.ToString()
,Datagridview1.Rows[i].Cells[3].Value.ToString()};

DtReport.Rows.Add(DGridReport);
}

R.FileName = @"Report_Name.rpt";
DtReport.TableName = "Orders";
R.SetDataSource(DtReport);

R.SetParameterValue(0, DateReport);
PrintPreView P = new PrintPreView();
P.Crv.ReportSource = R;
P.MdiParent = this.ParentForm;
P.Show();

nilmil_nil
چهارشنبه 06 مهر 1390, 09:16 صبح
سلام
یه آبجکت Dataset تو پروژه اضاف کن
بعد یه جدول توش اضاف کن و به تعداد ستون های دیتاگرید توش ستون بذار
بعد یه نمونه تو برنامه ازش بساز
و اونو با داده های دیتا گرید ویو پر کن
بعد برو تو کریستال تو قسمت آبجکت های دات نت خود پروژه
میبینی که اون دیتاست رو که اد کردی اونجا هستش
دیگه بقیشو خودتون بلد هستین
یه نمونه از فرمی که می خواید کریستال توش نشان داده شه و یه نمونه از کریستالی که ساختی و دیتا سورس کریستال رو با دیتاست پر می کنی و دیگه تمام

sobaisobai
چهارشنبه 06 مهر 1390, 11:08 صبح
اقا ارور داره؟
DtReport چیه؟

sobaisobai
چهارشنبه 06 مهر 1390, 11:10 صبح
فقط دوستمون که گفته بود از printdgv استفاده کن،من دارمش فقط نمی دونم چه جوری میشه ازش استفاده کرد؟

sobaisobai
چهارشنبه 06 مهر 1390, 12:46 عصر
کسی نیست جواب بده؟

sobaisobai
چهارشنبه 06 مهر 1390, 21:17 عصر
خواهشا اگه کسی بلده راهنمایی کنه

faravaghi
چهارشنبه 06 مهر 1390, 22:42 عصر
سلام،
با عرض پوزش کد رو اصلاح کردم.

sobaisobai
چهارشنبه 06 مهر 1390, 22:49 عصر
سلام دوباره
داداش بازم ارور داره
R چیه؟
DtReport چیه؟

faravaghi
چهارشنبه 06 مهر 1390, 23:04 عصر
سلام دوست گرامی،
این کد رو من از داخل یکی از پروژه هام کپی کردم. ببخشید.
اگه مشکل داشت در خدمتم:
if (Datagridview1.Rows.Count <= 0)
{
MessageBox.Show(". لطفا جهت چاپ اطلاعات مورد نظر را انتخاب نماييد");
return;
}

ReportDocument R = new ReportDocument();
DataTable DtReport = new DataTable();

DtReport.Columns.Add("orderNumber", typeof(string));
DtReport.Columns.Add("orderName", typeof(string));
DtReport.Columns.Add("address", typeof(string));
DtReport.Columns.Add("registerDate", typeof(string));

for (int i = 0; i < Datagridview1.Rows.Count ; i++)
{
string[] DGridReport = new string[] {
Datagridview1.Rows[i].Cells[0].Value.ToString()
,Datagridview1.Rows[i].Cells[1].Value.ToString()
,Datagridview1.Rows[i].Cells[2].Value.ToString()
,Datagridview1.Rows[i].Cells[3].Value.ToString()};

DtReport.Rows.Add(DGridReport);
}

R.FileName = @"Report_Name.rpt";
DtReport.TableName = "Orders";
R.SetDataSource(DtReport);

R.SetParameterValue(0, DateReport);
PrintPreView P = new PrintPreView();
//Crv = new CrystalDecisions.Windows.Forms.CrystalReportViewer ();
P.Crv.ReportSource = R;
P.MdiParent = this.ParentForm;
P.Show();
در ضمن این متغیر (PrintPreView) که تعریف کردم یک فرمه که تو اون فقط یک CrystalReportViewer با Modifiers به صورت Public که تو این کد فراخوانی شده.
DtReport هم یک DataTable است.

sobaisobai
چهارشنبه 06 مهر 1390, 23:06 عصر
داداش دمت گرم
درست شد

faravaghi
چهارشنبه 06 مهر 1390, 23:08 عصر
سلام،
کد رو یک نگاه کردی!
ReportDocument R = new ReportDocument();

sobaisobai
چهارشنبه 06 مهر 1390, 23:10 عصر
string[] DGridReport = new string[] {
[dataGridViewX1.Rows[i].Cells[0].Value.ToString()
,dataGridViewX1.Rows[i].Cells[1].Value.ToString()
,dataGridViewX1.Rows[i].Cells[2].Value.ToString()
,dataGridViewX1.Rows[i].Cells[3].Value.ToString()}
داداش از این ارور میگیره
ارور :Object reference not set to an instance of an object.

faravaghi
چهارشنبه 06 مهر 1390, 23:24 عصر
دوباره سلام،
ببین بذار من یک بار کد رو برات توضیح بدم، بعد ببین چطوریه برو برا خودت تغییر بده.
این کدی که من گذاشتم این جوریه که اول میاد اطلاعاتی که شما می خوای ببری تو کریستال ریپورت رو از DataGridView میگیره. یعنی میام یک DataTable تعریف میکنم

DataTable DtReport = new DataTable();

بعد باید براش ستون تعریف کنی

DtReport.Columns.Add("orderNumber", typeof(string));
DtReport.Columns.Add("orderName", typeof(string));
DtReport.Columns.Add("address", typeof(string));
DtReport.Columns.Add("registerDate", typeof(string));

این تعریف ستون بسته به نیاز تغییر میکنه. حتی اسم و نوع ستون ها رو هم می تونید تغییر بدید.
بعد از این مراحل باید مغادیر دلخواه رو تو یک آرایه از نوع رشته قرار بدیم تا بتونیم این آرایه رو داخل DataTable اضافه کنیم. این کا رو به اندازه تمام رکورد های DataGridView انجام میدیم، یعنی

for (int i = 0; i < Datagridview1.Rows.Count ; i++)
{
string[] DGridReport = new string[] {
Datagridview1.Rows[i].Cells[0].Value.ToString()
,Datagridview1.Rows[i].Cells[1].Value.ToString()
,Datagridview1.Rows[i].Cells[2].Value.ToString()
,Datagridview1.Rows[i].Cells[3].Value.ToString()};

DtReport.Rows.Add(DGridReport);
}

بعد از این عمل DataSource برای ReportDocument آماده میشه. فقط میمونه بقیه ماجرا که میشه این:

R.FileName = @"Report_Name.rpt";
DtReport.TableName = "Orders";
R.SetDataSource(DtReport);

زمانی که شما در فرم گزارش پارامتری تعریف کردی که می خوای مقدار دهی کنی از این کد استفاده میشه:

R.SetParameterValue(0, DateReport);

مثلا تاریخ برای گزارش. بعدش اومدم فرمی که قراره کاربر به عنوان نمونه اون رو ببینه رو بهش با کد زیر نشون میدم.

PrintPreView P = new PrintPreView();
//Crv = new CrystalDecisions.Windows.Forms.CrystalReportViewer ();
P.Crv.ReportSource = R;
P.MdiParent = this.ParentForm;
P.Show();
در آخر هم باید یادت باشه رکورد های DataTable رو حذف کنی چون اگه کاربر از چاپ منصرف بشه و دوباره دلش بخواد چاپ کنه اطلاعات قبلی به اضافه اطلاعات جدید براش نشون داده میشه که وقتی حذف کنی میشه فقط اطلاعات جدید:

for (int i = DtReport.Rows.Count - 1; i >= 0; i--)
{
DtReport.Rows.RemoveAt(i);
}

چیز دیگه هم هست.
اونم که شما گفتی برای اینه که مقادیر ستون دلخواه رو ببرم تو گزارش. حالا شما اسم DataGridView رو هر چی گذاشتی جایگزین کن یا یه جوری بجای اون بیا مقادیر رو بذار.

sobaisobai
چهارشنبه 06 مهر 1390, 23:29 عصر
از توضیحاتت ممنون متوجه شدم
فقط ارور زیر رو میگیره

string[] DGridReport = new string[] {
[dataGridViewX1.Rows[i].Cells[0].Value.ToString()
,dataGridViewX1.Rows[i].Cells[1].Value.ToString()
,dataGridViewX1.Rows[i].Cells[2].Value.ToString()
,dataGridViewX1.Rows[i].Cells[3].Value.ToString()}
ارور :Object reference not set to an instance of an object.

sobaisobai
چهارشنبه 06 مهر 1390, 23:32 عصر
مشکل قبلی حل شد حالا از کد زیر ارور میگیره

R.SetDataSource(DtReport);
Load report failed

faravaghi
چهارشنبه 06 مهر 1390, 23:34 عصر
سلام مجدد،
شما ببین چند تا ستون داری که می خوای چاپ بشه. به همون تعداد در DataTable ایجاد کن و به همون تعداد هم در رشته ای که داری اضافه میکنی.
دوما بجای 0 و 1 و ... میتونید اسم ردیف در DataGridView رو هم بنویسید، مثلا:
dataGridViewX1.Rows[i].Cells["DgOrderNum"].Value.ToString()

faravaghi
چهارشنبه 06 مهر 1390, 23:36 عصر
سلام،
شرمنده دیگه میگن سلام سلامتی میاره!
شما آدرس فایل rpt را باید درست بدین دیگه. هر جا ذخیره شده همون آدرس رو بدین. فقط یادتون باشه آدرس دهی نسبی باشه.
مثلا اگه تو یک پوشه به نام Report قرار داره این جوری میشه:
R.FileName = @"Report\CustomerRpt.rpt";

sobaisobai
چهارشنبه 06 مهر 1390, 23:40 عصر
75976
75977
75978
75979
داداش من برنامه ام رو الان اپلود کردم شما زحمت بکش تغییرات رو روش اعمال کن
اول باید اسم سخت افزار و مدل و تعداد رو تو تکس باکس انتخاب کن بهد دکمه اضافه رو بزن
دستت درد نکنه

faravaghi
چهارشنبه 06 مهر 1390, 23:58 عصر
سلام،
شما چرا برای این فایل گزارش ایجاد نکردی؟
می خوای تو چه قالبی اطلاعاتت رو بریزی؟
در ضمن اون ایرادی که به حلقه For میگیره مال اینه که شما خاصیت Adding رو روی DataGridView فعال کردی بعد اگه یک رکورد اضافه کنی چون یک سطر اضافه ایجاد میکنه و اطلاعاتش NULL است بهت پیغام خطا میده.
یا بیا این خاصیت رو حذف کن یا در شرط حلقه تعداد سطرهای DataGridView رو یکی ازش کم کن:
for (int i = 0; i < dataGridViewX1.Rows.Count-1; i++)
{
string[] DGridReport = new string[] {
dataGridViewX1.Rows[i].Cells[0].Value.ToString()
,dataGridViewX1.Rows[i].Cells[1].Value.ToString()
,dataGridViewX1.Rows[i].Cells[2].Value.ToString()
,dataGridViewX1.Rows[i].Cells[3].Value.ToString()
,dataGridViewX1.Rows[i].Cells[4].Value.ToString()};
DtReport.Rows.Add(DGridReport);
}
در ضمن این اطلاعات در بانک ذخیره میشه یا نه؟

sobaisobai
پنج شنبه 07 مهر 1390, 00:03 صبح
بله داخل بانک ذخیره نمیشه از بانک اطلاعات سخت افزار و مدل و ... میخونه فقط
خاصیت add دیتا گرید رو غیرفعال کردم
فایل گزارش رو هم به پروژه اضافه کردم
حالا از کد زیر ارور میگیره

R.SetDataSource(DtReport);
The report has no tables

faravaghi
پنج شنبه 07 مهر 1390, 00:08 صبح
سلام،
بیزحمت فایل گزارش رو برام بفرستین

sobaisobai
پنج شنبه 07 مهر 1390, 00:12 صبح
سلام
فقط ادرس فایل رو هم اینو دادم

R.FileName = @"C:\Documents and Settings\Mohammad Amin\My Documents\Visual Studio 2008\Projects\WindowsFormsApplication5\WindowsForm sApplication5\CrystalReport1.rpt";

faravaghi
پنج شنبه 07 مهر 1390, 00:33 صبح
سلام،
خسته نباشی!!
خودم بلد بودم یک فایل خالی Report بسازم.
برات فایل رو ساختم برو خودت اصلاحش کن.
درضمن تو بانکت یک جدول به نام Report ایجاد کردم و مقادیری رو که قراره تو گزارش چاپ بشه رو تعریف کردم که با استفاده از اون بشه اطلاعات رو پرینت گرفت.
یه نگاهی هم به کد بندازی بد نیست.
بقیه اش دیگه صلیقه و خلاقیت خودت رو میطلبه.
در ضمن اون حذف رکورد های DataTable رو هم حتما به آخر کدت اضافه کن من یادم شد.
یا حق

faravaghi
پنج شنبه 07 مهر 1390, 01:02 صبح
سلام دوست گرامی،
اینم یک PDF برای همین مثال شما.
اگه وقت داشتی یک نگاه بنداز بد نیست.