首先创建水晶报表rpt文件方法还是采用xsd数据集的方式简便容易操作记得将数据集中的相关字段设为你想要在报表中呈现的字段比如说在内容左边加入一个图片就将相应的图片字段拖放过去能不能直接在水晶报表上添加一个图片然后修改?我做了几次实验好像都不得要领所以还是放弃走最老式的方式先在数据库中创建一个准备在水晶报表中使用到的字段的表然后再通过这张表创建数据集xsd文件再通过数据集创建水晶报表虽然方法绕了路但是绝对是可行的 通过数据集创建dataset DataSetpictureTabDataTable pt = new DataSetpictureTabDataTable(); DataSetTableAdapterspictureTabTableAdapter da = new DataSetTableAdapterspictureTabTableAdapter(); daFill(pt); CrystalReport cr = new CrystalReport(); crSetDataSource((DataTable)pt); thiscrystalReportViewerReportSource = cr; 表名叫做pictureTab因此创建的数据集有表pictureTabDataTable类和适配器pictureTabTableAdapter奇怪的是前面的命名空间着实没有找到不过无关要害 通过数据库创建Dataset SqlConnection conn = new SqlConnection(Data Source=(Local);Initial Catalog=MyDB;User ID=sa;Password=yamato); SqlDataAdapter da = new SqlDataAdapter(select * from pictureTab where name =e conn); DataSet ds = new DataSet(); daFill(ds NewTable); CrystalDecisionsCrystalReportsEngineReportDocument doc = new CrystalDecisionsCrystalReportsEngineReportDocument(); docLoad(@C:\Documents and Settings\jiez\桌面\CrystalReportsApplication\CrystalReportsApplication\CrystalReportrpt); docSetDataSource(dsTables[NewTable]); thiscrystalReportViewerReportSource = doc; 这个其实也没什么好说的只是修改了一下报表加载的方式而已 厉害的来了本地图片加载 DataSet ds = new DataSet(); dsTablesAdd(NewTable); dsTables[]ColumnsAdd(id TypeGetType(SystemInt)); dsTables[]ColumnsAdd(picture TypeGetType(SystemByte[])); dsTables[]ColumnsAdd(name TypeGetType(SystemString)); string picPath = @C:\Documents and Settings\jiez\My Documents\My Pictures\logojpg; AddOneRow(dsTables[NewTable] picPath Jackey); CrystalDecisionsCrystalReportsEngineReportDocument doc = new CrystalDecisionsCrystalReportsEngineReportDocument(); docLoad(@C:\Documents and Settings\jiez\桌面\CrystalReportsApplication\CrystalReportsApplication\CrystalReportrpt); docSetDataSource(dsTables[NewTable]); thiscrystalReportViewerReportSource = doc; public void AddOneRow(DataTable tbl string c string c string c) { FileStream fs = new FileStream(c FileModeOpen); BinaryReader br = new BinaryReader(fs); DataRow row = tblNewRow(); row[] = c; row[] = c; row[] = brReadBytes((int)brBaseStreamLength); tblRowsAdd(row); } 这里自己创建了一个dataset并且往里面添加了数据都是自己进行设定这样灵活性就很高了要注意的是这里的数据读取采用的是BinaryReader直接就用二进制的方式进行了读取 是可以实现的 注释:AddOneRow 函数中并没有关闭数据流 fsClose();fsClose(); public void AddOneRow(DataTable tbl string c string c string c) { FileStream fs = new FileStream(c FileModeOpen); FileStream fs = new FileStream(c FileModeOpen); BinaryReader br = new BinaryReader(fs); BinaryReader br = new BinaryReader(fs); DataRow row = tblNewRow(); row[] = brReadBytes((int)brBaseStreamLength); row[] = brReadBytes((int)brBaseStreamLength); tblRowsAdd(row); fsClose(); fsClose(); } protected void Page_Load(object sender EventArgs e) { //sql SqlConnection conn = new SqlConnection(PublicVarstrCon_SHATDB); SqlDataAdapter da = new SqlDataAdapter(select * from stamp conn); DataSet ds = new DataSet(); daFill(ds NewTable); //存储过程取得ds SqlParameter[] parms = new SqlParameter[]; parms[] = new SqlParameter(@id SqlDbTypeInt); parms[]Value = ; //部门 DataSet ds = new DataSet(); ds = DataAccessDataAccessSHDBGetTableByStore(test parms)DataSet; //DataSet ds = new DataSet(); string picPath = @C:\test\jpg; string picPath = @C:\test\jpg; AddOneRow(dsTables[] picPath picPath); CrystalDecisionsCrystalReportsEngineReportDocument doc = new CrystalDecisionsCrystalReportsEngineReportDocument(); docLoad(@C:\test\rpt);//报表已经设置签名的image字段 docSetDataSource(dsTables[]); CrystalReportViewerReportSource = doc; CrystalReportViewerDataBind(); } 后来我根据思路重构了一下 报表的dataset中设置需要签名的字段一定要是IMAGE 路径保存在数据中 public void AddOneRow(DataTable tbl string c string c string c string c string cstring cstring c) { //FileStream fs = new FileStream(c FileModeOpen); //FileStream fs = new FileStream(c FileModeOpen); //BinaryReader br = new BinaryReader(fs); //BinaryReader br = new BinaryReader(fs); //DataRow row = tblNewRow(); //row[] = c; //row[] = brReadBytes((int)brBaseStreamLength); //row[] = brReadBytes((int)brBaseStreamLength); //fsClose(); //fsClose(); //tblRowsAdd(row); for (int i = ; i < tblRowsCount; i++) //如果在头部那么第一行就够了 如果在尾部最后一行就OK 如果在Group 中就必须所有行 { FileStream fs = new FileStream(c FileModeOpen); FileStream fs = new FileStream(c FileModeOpen); FileStream fs = new FileStream(c FileModeOpen); FileStream fs = new FileStream(c FileModeOpen); FileStream fs = new FileStream(c FileModeOpen); FileStream fs = new FileStream(c FileModeOpen); FileStream fs = new FileStream(c FileModeOpen); BinaryReader br = new BinaryReader(fs); BinaryReader br = new BinaryReader(fs); BinaryReader br = new BinaryReader(fs); BinaryReader br = new BinaryReader(fs); BinaryReader br = new BinaryReader(fs); BinaryReader br = new BinaryReader(fs); BinaryReader br = new BinaryReader(fs); tblRows[i][] = brReadBytes((int)brBaseStreamLength); tblRows[i][] = brReadBytes((int)brBaseStreamLength); tblRows[i][] = brReadBytes((int)brBaseStreamLength); tblRows[i][] = brReadBytes((int)brBaseStreamLength); tblRows[i][] = brReadBytes((int)brBaseStreamLength); tblRows[i][] = brReadBytes((int)brBaseStreamLength); tblRows[i][] = brReadBytes((int)brBaseStreamLength); fsClose(); fsClose(); fsClose(); fsClose(); fsClose(); fsClose(); fsClose(); //tblRowsAdd(row); } } private void CrystalReportDataBind(int id) { SqlParameter[] parms = new SqlParameter[]; parms[] = new SqlParameter(@id SqlDbTypeInt); parms[]Value = id; //部门 DataSet ds = new DataSet(); ds = DataAccessDataAccessSHDBGetTableByStore(project parms)DataSet; //以下部分是读取本地图片 string strURL =select ustamp_path from taskline tl left join users u on tlUserID=u[ID] where taskcode=+lbl_taskcodeText+ and TurnTo= AND Result=Y ; string[] picPath=new string[]; for(int i=;i<=;i++) { if (stringIsNullOrEmpty(PublicFunctionStringGetValue(strURL + and taskline= + (i + ) )) == false) //取得已经审批人的本地签名地址 { //picPath[i] = @ + PublicFunctionStringGetValue(strURL + and taskline= + (i + ) ); //string urlPath = ServerMapPath(\\Reports\\+PublicFunctionStringGetValue(strURL + and taskline= + (i + ) ));//无法动态解析服务器地址 picPath[i] = PublicFunctionStringGetValue(strURL + and taskline= + (i + ) ); //保存本地地址 } else { switch (i) { case : picPath[i] = @C:\stamp\空白jpg; //空白地址页面 防止进程同时被占用 break; case : picPath[i] = @C:\stamp\空白jpg; break; case : picPath[i] = @C:\stamp\空白jpg; break; case : picPath[i] = @C:\stamp\空白jpg; break; case : picPath[i] = @C:\stamp\空白jpg; break; case : picPath[i] = @C:\stamp\空白jpg; break; case : picPath[i] = @C:\stamp\空白jpg; break; } } } //string picPath = @C:\test\jpg; //string picPath = @C:\test\jpg; AddOneRow(dsTables[] picPath[] picPath[] picPath[] picPath[] picPath[] picPath[] picPath[]); CrystalDecisionsCrystalReportsEngineReportDocument doc = new CrystalDecisionsCrystalReportsEngineReportDocument(); string reportPath = ServerMapPath(\\Reports\\projectrpt); //docLoad(@C:\test\rpt); docLoad(reportPath); docSetDataSource(dsTables[]); CrystalReportViewerReportSource = doc; CrystalReportViewerDataBind(); } |