ارتباط Crystal Report و بانک اطلاعاتی (روش غیر مستقیم)
در این آموزش قصد دارم که شما را با نحوه ی ارتباط با کریستال با روش غیر مستقیم آشنا کنم . این روش به دلیل انعطاف پذیری بالا توصیه میشه . در حالت کلی شما باید یک Dataset را طراحی کنید و بعد از پر کردن آن با داده های خود ، آن را به عنوان منبع داده به کریستال ریپورت معرفی کنید . بانکی که قصد داریم در این مثال معرفی کنیم ، ساختارو داده هایی به شکل زیر دارد :
ایجاد Dataset
برای ایجاد و طراحی Dataset دو راه وجود دارد . می تونید از ابزارهای طراحی Visual Studio استفاده کنید یا اینکه از طریق کد و به صورت داینامیک این کار را انجام دهید ، در این مثال از روش اول استفاده می کنیم . ابتدا بر روی نام پروژه در Solution Explorer راست کلیک کرده و سپس از گزینه Add آیتم New Item… را انتخاب می کنیم :
همانطور که در شکل زیر مشاهده می کنید از پنجره باز شده از قسمت Data ، گزینه Dataset را انتخاب کرده و بر روی دکمه ی Add کلیک می کنیم .
در شکل زیر محیط طراحی Dataset نمایش داده شده است . برای ایجاد یک datatable در dataset بر روی یک قسمت خالی کلیک راست کرده و به صورت زیر یک Datatable ایجاد می کنیم . هر dataset از چند datatable تشکیل می شود . datatable را باید شبیه table موجود در بانک(tablePersonels) ایجاد کنیم زیرا قصد داریم داده های جدول را در آن قرار دهیم .
برای تغییر نام پیشفرض datatable بر روی عنوان آن راست کلیک کرده و گزینه Rename را انتخاب کنید و سپس نام آن را به tablePersonels تغییر دهید .
حال نوبت به اضافه کرده ستون هایی مشابه ستون های موجود در جدول بانک اطلاعاتی می رسد . برای این کار بر روی datatable کلیک راست کرده و به صورت زیر ستون هایی هم نام با جدول بانک ایجاد می کنیم :
بعد از ایجاد ستون می توانیم از پنجره ی Properties خصوصیات مختلف ستون از جمله نوع داده های آن ، نام ، عنوان و… را تغییر دهید :
دو مرحله ی بالا را تا ایجاد کامل ستون ها تکرار کنید تا به صورت شکل زیر ستون ها به datatable اضافه شوند .
یک فرم به صورت زیر در پروژه ایجاد کرده و کنترل های Datagridview و دکمه را بر روی آن قرار دهید :
برای انتقال اطلاعات از پایگاه داده به Dataset ای که در مراحل قبلی ایجاد کردیم ابتدا یک شی از آن ایجاد می کنیم و سپس با استفاده از متدی به صورت زیر اطلاعات موجود در بانک را به آن انتقال می دهیم :
1: private DataSet1 DataSource = new DataSet1(); 2: 3: public DataTable SelectData() 4: { 5: string connectionstring = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 6: string selectQuery = "SELECT * FROM tablePersonels;"; 7: SqlConnection SqlConnection1 = new SqlConnection(connectionstring); 8: SqlCommand SqlCommand1 = new SqlCommand(selectQuery, SqlConnection1); 9: SqlDataAdapter SqlDataAdapter1 = new SqlDataAdapter(SqlCommand1); 10: 11: try 12: { 13: DataTable result = new DataTable(); 14: SqlDataAdapter1.Fill(this.DataSource.Tables["tablePersonels"]); 15: return this.DataSource.Tables[0]; 16: } 17: catch (Exception ex) 18: { 19: MessageBox.Show(ex.Message); 20: return null; 21: } 22: finally 23: { 24: SqlCommand1.Connection.Close(); 25: } 26: }
سپس در رویداد Form_Load کد زیر را می نویسیم :
private void Form2_Load(object sender, EventArgs e) { this.dataGridView1.DataSource = this.SelectData(); }
همانطور که در کد بالا می بینید خروجی متد SelectData که همان جدول tablePersonels موجود در Dataset است را به عنوان منبع داده Datagridview معرفی کرده ایم . با اجرای برنامه داده های به شکل زیر نمایش داده می شوند :
معمولا کاربر داده های گزارش را در یک فرم جدا مشاهده می کند . برای این کار یک فرم خالی با نام frmReporting ایجاد کرده و از قسمت Toolbox کنترل CrystalReportViewer را بر روی آن بکشید :
برای نمایش داده ها در کریستال ریپورت از کنترل CrystalReportViewer استفاده می شود . چون قرار است که اطلاعات بین دو فرم ردو بدل شود یعنی از فرم اصلی به فرمی که ایجاد کرده ایم ( frmReporting ) انتقال داده شوند . باید یک خاصیت از نوع Dataset1(که در مراحل قبلی طراحی کردیم) در فرم FrmReporting ایجاد کنیم، برای اینکار بر روی فرم frmReporting دوبار کلیک کرده و کد زیر را در می نویسید :
//منبع داده برای گزارش که از فرم 1 ارسال می کنیم public DataSet1 DataSource { get; set; } private void frmReporting_Load(object sender, EventArgs e) { CrystalReport1 report1 = new CrystalReport1(); report1.SetDataSource(this.DataSource.Tables["tablePersonels"]); crystalReportViewer1.ReportSource = report1; }
برای نمایش گزارش ، باید یک شی از کلاس CrystalReport1 ایجاد کنیم و با استفاده از متد SetDataSource آن منبع داده (یعنی خصوصیت DataSource) را به آن معرفی کنیم . این خصوصیت از جنس Dataset می باشد و دارای خصوصیتی دیگر به نام Tables است که جدولی که در مراحل قبل به نام tablePersonels ایجاد کردیم را در خود جای می دهد . این که چرا باید یک شی از کلاسی با نام CrystalReport1 ایجاد کنیم بستگی به نام کلاس گزارش ما دارد . برای فهمیدن نام کلاس به شکل زیر عمل می کنیم :
حال در فرم اصلی بر روی دکمه دوبار کلیک کرده و کد زیر را در رویداد کلیک آن بنویسید :
if (this.DataSource.tablePersonels.Rows.Count > 0) { frmReporting reporting = new frmReporting(); reporting.DataSource = this.DataSource; reporting.ShowDialog(); }
این کد تعداد سطرهای داخل منبع داده را بررسی میکند اگر رکوردی وجود داشته باشد ، یک شی از فرم frmReporting را ایجاد می کند و منبع داده را در خاصیت DataSource آن قرار می دهد. در درس های بعدی درباره محیط طراحی Crystal Report توضیح می دهیم .