1:首先我们已经有了一个单表的完整水晶报表应用
2:为了能挂接我们的本地图片,在dataset里新建立一个表mylogo。
里面放上两个字段,字段类型为System.Byte[]或System.sByte[]
注意,默认类型里只有System.Byte和System.SByte,要自己输入的。
这个mylogo就是一个中介,我们把本地图片读到这个表里,水晶报表从这个表里读到图片显示。
3:在现有报表里加入一个子报表,数据源就是这个mylogo.
把两个字段拖到子报表上。
4:代码段是这样的
C# code
//设置数据源信息
DataSet1 ds1 = new DataSet1();
OleDbDataAdapter da = new OleDbDataAdapter();
String connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath ("~/app_data/test.mdb")+";";
OleDbConnection cn = new OleDbConnection(connstr);
//获取记录集,注意,最终获取的记录集需要与xsd的结构一致!
da = new OleDbDataAdapter("SELECT EmployeeId1 as EmployeeId,EmployeeName1 as EmployeeName From Employee1", cn);
da.Fill(ds1, "Employee");
//把本地图片先写入到数据集
//将图片读到stream,并转换为byte[]
//图片1
FileStream fs1 = new FileStream(@"c:/1.bmp", FileMode.Open, FileAccess.Read);
BinaryReader br1 = new BinaryReader(fs1);
byte[] bt1 = br1.ReadBytes((int)fs1.Length);
//图片2
FileStream fs2 = new FileStream(@"c:/a2.jpg", FileMode.Open, FileAccess.Read);
BinaryReader br2 = new BinaryReader(fs2);
byte[] bt2 = br2.ReadBytes((int)fs2.Length);
fs1.Close();
fs2.Close();
//写入到ds1中(仅1行)
ds1.myLogo.AddmyLogoRow(bt1, bt2);
//以上为数据部分,与报表无关
//-----------------------------------------------------------
//以下为报表部分
//使用报表对象加载报表
string reportPath = Server.MapPath("~/app_data/crystalreport1.rpt");
myReport.Load(reportPath);
//绑定数据集,注意,一个报表用一个数据集。
myReport.SetDataSource(ds1);
CrystalReportViewer1.ReportSource = myReport;
5:效果是这样的