مشکل عکس وCrystallReport

خیلی از برنامه نویسان با عکس در کریستال ریپورت مشکل دارند در حالیکه نمایش عکس در کریستال بسیار ساده است.

در این بخش سعی می کنم تا حدی این مطلب رو باز کنم:

1- یک پروژه جدید از نوع Windows Form Application ایجاد کنید

2- از منوی project گزینه AddNewItem را انتخاب کنید تا کادر زیر ظاهر شود

 

 

 

 

 

 

 

 

 

 

همانطور که در تصویر مشخص است بخش Reporting و سپس Crystal Report را انتخاب کنید تا یک فایل rpt به پروژه شما اضافه شود(ترجیحا نام ImageInReport را وارد کنید)

در Solution Explorer روی ImageInReport.rpt دوبار کلیک کنید تا به محیط کریستال وارد شوید

در اینجا شما نیاز به یک فیلد از نوع Blob برای قرار دادن عکس در اون دارید . این فیلد یک فیلد دیتابیس از نوع system.Byte() (آرایه ای از نوع بایت)می باشد.

 از منوی Project گزینه NewItem را انتخاب کنید و مطابق تصویر زیر یک DataSet به پروژه خود اضافه کنید

 

 

 

 

 

 

 

 

 

 

در solutionExplorer روی imgDset.xsd دوبار کلیک کنید تا محیط طراحی DataSet باز شود. سپس روی یک جای خالی صفحه راست کلیک کرده و از زیرمنوی Add گزینه DataTable را انتخاب کنید تا یک جدول جدید ایجاد شود.سپس روی یک جای خالی در جدول کلیک راست کرده و از منوی Add گزینه Column را انتخاب کرده تا یک ستون جدید به جدول ما اضافه شود.(نام ستون را ترجیحا img بگذارید) در حالی که ستون را انتخاب کرده اید کلیدF4 را بزنید تا به Properties برای این ستون بروید و DataType را برابر System.Byte() انتخاب کنید

مطابق تصویر زیر

 

 

 

 

 

 

 

 

 

 

بر روی ImageInReport در Solution Explorer دو بار کلیک کنید. در قسمت سمت چپ Field Explorer را باز کنید(اگر نبود روی یک جای خالی از صفحه راست کلیک کرده و FieldExplorer را انتخاب کنید).

در Field Explorer روی DataBaseFields راست کلیک کرده و DataBaseExpert را انتخاب کنید و مطابق تصویر زیر عمل کنید:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

بر روی ok کلیک کنید حال در Field Explorer در قسمت DataBase Field قسمتimgTlb را باز کرده و بر روی img که همان نام ستون است راست کلیک کرده و InsertToReport را بزنید و آنرا در محل مناسبی از گزارش خود قرار دهید می بینید که یک فیلد Blob در گزارش خود دارید.

کدنویسی:

به فرم خود بازگردید. از Toolbox از قسمت Reporting یک CrystalReportViewer روی فرم خود قرار دهید همچنین یک Button روی آن قرار دهید تا با کلیک بر روی آن عکس دلخواه نمایش داده شود در انتها فرمی به شکل زیر داریم:

 

 

 

 

 

 

 

 

 

 

 

 

 

توسط کدهای زیر عکس را از هر آدرسی که هست بخوانید و درون یک FileStream بریزید دقت کنید که application.startupPath.... آدرس عکس در سیستم من است.

' here i have define a simple datatable inwhich image will recide

Dim dt As New DataTable

' object of data row

Dim drow As DataRow

' add the column in table to store the image of Byte array type

dt.Columns.Add("Image", System.Type.GetType("System.Byte[]"))

drow = dt.NewRow

' define the filestream object to read the image

Dim fs As FileStream

' define te binary reader to read the bytes of image

Dim br As BinaryReader

' check the existance of image

If File.Exists(Application.StartupPath + "\mory.jpg") Then

' open image in file stream

fs = New FileStream(Application.StartupPath + "\mory.jpg", FileMode.Open)

Else ' if phot does not exist show the nophoto.jpg file

fs = New FileStream("NoPhotoYet.png", FileMode.Open)

End If

ابتدا چک می شود که آیا عکس وجود دارد یا خیر اگر وجود نداشته باشد NoPhotoyet در FS قرار داده می شود

در ادامه کدهای زیر را وارد کنید تا عکس را در یک سطر از جدول ایجاد شده بریزید

' initialise the binary reader from file streamobject

br = New BinaryReader(fs)

' define the byte array of filelength

Dim imgbyte(fs.Length) As Byte

' read the bytes from the binary reader

imgbyte = br.ReadBytes(Convert.ToInt32((fs.Length)))

drow(0) = imgbyte ' add the image in bytearray

dt.Rows.Add(drow) ' add row into the datatable

br.Close() ' close the binary reader

fs.Close()

کار تمام است حالا کدهای زیر را وارد کنید تا گزارش را در ReportViewer ببینید

Dim rptobj As New ImageInReport ' object of crystal report

rptobj.SetDataSource(dt) ' set the datasource of crystalreport object

CrystalReportViewer1.ReportSource = rptobj 'set the report source

حال می توانید عکس را در گزارش مشاهده کنید مانند زیر:

 

 

 

 

 

 

 

 

 

 

 

البته نکات زیادی باقی مونده که در ادامه آنها را بررسی خواهم کرد

 

 

 

 

 

 

گزارش تخلف
بعدی