水晶报表的一个简单的问题,解决就给分 空白报表如何通过编程方式指定数据库文件?比如我现在有个sf.mdb,通过openfiledialog浏览到后如何让预定格式的1.rpt连接到这个文件?如何让用户可以指定某一表?又如何让某一表的全部或者某些字段成为显示列?我现在连是否可以办到这些都不太明白,高人指教~! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你我也在考虑相同的问题,你看用DataSet可以不。 有没有高人解释下下面说的方法?============================================动态设置数据源(采用push方式) 1.根据报表的结构字段,建立一个xsd文件,用来存放数据。 2.新建一个报表,注意建立的时候要浏览到该xsd文件, 建好后找到该报表的属性"自定义工具",把原来的 "CrystalDecisions.VSDesigner.CodeGen.ReportCodeGenerator" 改为"CrystalDecisions.VSShell.CodeGen.ReportCodeGenerator" 这样就会产生一个按照你报表名命名的zsmxb.cs文件,其实就是下面的类zsmxb 同时建立一个页面,把CrystalReportViewer控件放到页面, 并且要在该页面文件的顶部申明一下报表的类, public class Fr_zsmxb : System.Windows.Forms.Form { zsmxb crReportDocument; ......... 3.建立报表结构 DataSet dss=new DataSet(); DataTable dt=new DataTable("zsmxb"); dt.Columns.Add("cchbh",System.Type.GetType("System.String")); dt.Columns.Add("nglf",System.Type.GetType("System.Decimal")); dt.Columns.Add("ncf",System.Type.GetType("System.Decimal")); dt.Columns.Add("nqyf",System.Type.GetType("System.Decimal")); dt.Columns.Add("nzsf",System.Type.GetType("System.Decimal")); dt.Columns.Add("ntcf",System.Type.GetType("System.Decimal")); dt.Columns.Add("ngz",System.Type.GetType("System.Decimal")); dt.Columns.Add("nzjf",System.Type.GetType("System.Decimal")); dt.Columns.Add("nylf",System.Type.GetType("System.Decimal")); dt.Columns.Add("nwxf",System.Type.GetType("System.Decimal")); dt.Columns.Add("nsy",System.Type.GetType("System.Decimal")); dt.Columns.Add("nqtf",System.Type.GetType("System.Decimal")); dt.Columns.Add("nxj",System.Type.GetType("System.Decimal")); dss.Tables.Add(dt); 注意:这里的DataTable dt=new DataTable("zsmxb");这句中表名"zsmxb"要和你的xsd文件中的表名要一样, 同时,dt的字段名、类型,都要和xsd文件一样,否则回产生"查询引擎错误"。 4.为这个ds传入数据 for(int i=0;i<this.ds.Tables["zsmxb"].Rows.Count;i++) { DataRow dr=dt.NewRow(); dr["cchbh"]=this.ds.Tables["zsmxb"].Rows[i]["cchbh"]; dr["nglf"]=this.ds.Tables["zsmxb"].Rows[i]["nglf"]; dr["ncf"]=this.ds.Tables["zsmxb"].Rows[i]["ncf"]; dr["nqyf"]=this.ds.Tables["zsmxb"].Rows[i]["nqyf"]; dr["nzsf"]=this.ds.Tables["zsmxb"].Rows[i]["nzsf"]; dr["ntcf"]=this.ds.Tables["zsmxb"].Rows[i]["ntcf"]; dr["ngz"]=this.ds.Tables["zsmxb"].Rows[i]["ngz"]; dr["nzjf"]=this.ds.Tables["zsmxb"].Rows[i]["nzjf"]; dr["nylf"]=0; dr["nwxf"]=0; dr["nsy"]=0; dr["nqtf"]=this.ds.Tables["zsmxb"].Rows[i]["nqtf"]; dr["nxj"]=System.Convert.ToDecimal(dr["nglf"].ToString())+System.Convert.ToDecimal(dr["ncf"].ToString(); dt.Rows.Add(dr); } 这里的ds是同过查询得到的,这里只是举个例子。 5.把得到的报表数据源dss绑定到水晶报表。 crReportDocument=new zsmxb(); crReportDocument.SetDataSource(dss); crystalReportViewer1.ReportSource = crReportDocument; 可以 动态换数据源。不过代码记不起来(有点多),等明天我去公司看看。还有你后面的几个问题,你是用vs2003?是的话,打开一个报表文件是可以设置连接源的,一般双击oledb(选择连接驱动的对话框)来选择你要连接的模式,等数据源确定后,就可以把字段往报表中拖了。 你是用vs2003?是的话,打开一个报表文件是可以设置连接源的=====================我知道。但这是在设计报表的阶段啊。我的报表设计好了后,在程序运行中,又如何让用户可以选择数据源呢》?如果方便的话,你的代码可否简要地发往:[email protected].多谢兄台! aihui109() 兄弟出来说个话呀。。 可以在程序运行中改变数据源,不过好像只能适应改Web.config里链接源的那种。我们公司开发部不能上网啊。兄弟你急不?我明天去用纸抄(脑袋笨,实在记不住)。 呵呵。。太感谢了。那劳费你了。不过我的代码用在winform上。。无论如何,对我有很大的参考价值。。再次感谢兄台出手! using System;using CrystalDecisions.Shared;using CrystalDecisions.CrystalReports.Engine;namespace WebComPoc{ /// <summary> /// Class1 的摘要说明。 /// </summary> public class Print { public Print() { // // TODO: 在此处添加构造函数逻辑 // } public static void SetDatabaseLogonInfo(CrystalDecisions.CrystalReports.Engine.ReportDocument source) { CrystalDecisions.Shared.TableLogOnInfo logOnInfo = new CrystalDecisions.Shared.TableLogOnInfo(); int i = 0; for(i = 0;i <source.Database.Tables.Count; i ++) { //设置服务器名 logOnInfo.ConnectionInfo.ServerName = "bssrv"; //数据源 logOnInfo.ConnectionInfo.DatabaseName = "sbms"; //登录名 logOnInfo.ConnectionInfo.UserID = "sa"; //密码 logOnInfo.ConnectionInfo.Password = ""; source.Database.Tables[i].ApplyLogOnInfo(logOnInfo); } //设置子报表 for(i= 0;i<source.ReportDefinition.ReportObjects.Count;i++) { if(source.ReportDefinition.ReportObjects[i].Kind == ReportObjectKind.SubreportObject) { ReportDocument subReport = source.OpenSubreport(((SubreportObject)(source.ReportDefinition.ReportObjects[i])).SubreportName); //子报表 SetDatabaseLogonInfo(subReport); } } } }} 是啊。我这是web的,希望能给你提示。这个函数用在 水晶报表 的显示之前。source.Load("报表路径"),得到source传到上面的函数中去。 GridView问题 调试中查看对象内容的窗口是如何实现的 一个不是循环的死循环!!求助解决。(C# WinForm) 打开新窗体前显示FLASH,新窗体加载完FLASH关闭 sendmessage() 怎么其他窗体发送快捷键ya ? 急 !!!C#项目... 如何让DataGridView可编辑,编辑完成后,点击“确定”更新数据库? 求,.net WinForm控件可多表头,数据绑定(开放源代码的Grid控件) 菜鸟问题,关于ADO.Net的Fill方式. 关于一个Form的最基本的问题,来吧! 小弟有问题正在举手中 如何实现在下拉框中搜索
1.根据报表的结构字段,建立一个xsd文件,用来存放数据。
2.新建一个报表,注意建立的时候要浏览到该xsd文件,
建好后找到该报表的属性"自定义工具",把原来的
"CrystalDecisions.VSDesigner.CodeGen.ReportCodeGenerator"
改为"CrystalDecisions.VSShell.CodeGen.ReportCodeGenerator"
这样就会产生一个按照你报表名命名的zsmxb.cs文件,其实就是下面的类zsmxb
同时建立一个页面,把CrystalReportViewer控件放到页面,
并且要在该页面文件的顶部申明一下报表的类,
public class Fr_zsmxb : System.Windows.Forms.Form
{
zsmxb crReportDocument;
.........
3.建立报表结构
DataSet dss=new DataSet();
DataTable dt=new DataTable("zsmxb");
dt.Columns.Add("cchbh",System.Type.GetType("System.String"));
dt.Columns.Add("nglf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("ncf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nqyf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nzsf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("ntcf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("ngz",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nzjf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nylf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nwxf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nsy",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nqtf",System.Type.GetType("System.Decimal"));
dt.Columns.Add("nxj",System.Type.GetType("System.Decimal"));
dss.Tables.Add(dt);
注意:这里的DataTable dt=new DataTable("zsmxb");这句中表名"zsmxb"要和你的xsd文件中的表名要一样,
同时,dt的字段名、类型,都要和xsd文件一样,否则回产生"查询引擎错误"。
4.为这个ds传入数据
for(int i=0;i<this.ds.Tables["zsmxb"].Rows.Count;i++)
{
DataRow dr=dt.NewRow();
dr["cchbh"]=this.ds.Tables["zsmxb"].Rows[i]["cchbh"];
dr["nglf"]=this.ds.Tables["zsmxb"].Rows[i]["nglf"];
dr["ncf"]=this.ds.Tables["zsmxb"].Rows[i]["ncf"];
dr["nqyf"]=this.ds.Tables["zsmxb"].Rows[i]["nqyf"];
dr["nzsf"]=this.ds.Tables["zsmxb"].Rows[i]["nzsf"];
dr["ntcf"]=this.ds.Tables["zsmxb"].Rows[i]["ntcf"];
dr["ngz"]=this.ds.Tables["zsmxb"].Rows[i]["ngz"];
dr["nzjf"]=this.ds.Tables["zsmxb"].Rows[i]["nzjf"];
dr["nylf"]=0;
dr["nwxf"]=0;
dr["nsy"]=0;
dr["nqtf"]=this.ds.Tables["zsmxb"].Rows[i]["nqtf"];
dr["nxj"]=System.Convert.ToDecimal(dr["nglf"].ToString())+System.Convert.ToDecimal(dr["ncf"].ToString();
dt.Rows.Add(dr);
}
这里的ds是同过查询得到的,这里只是举个例子。
5.把得到的报表数据源dss绑定到水晶报表。
crReportDocument=new zsmxb();
crReportDocument.SetDataSource(dss);
crystalReportViewer1.ReportSource = crReportDocument;
还有你后面的几个问题,你是用vs2003?是的话,打开一个报表文件是可以设置连接源的,一般双击oledb(选择连接驱动的对话框)来选择你要连接的模式,等数据源确定后,就可以把字段往报表中拖了。
我们公司开发部不能上网啊。兄弟你急不?我明天去用纸抄(脑袋笨,实在记不住)。
using CrystalDecisions.Shared;
using CrystalDecisions.CrystalReports.Engine;namespace WebComPoc
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class Print
{
public Print()
{
//
// TODO: 在此处添加构造函数逻辑
//
} public static void SetDatabaseLogonInfo(CrystalDecisions.CrystalReports.Engine.ReportDocument source)
{
CrystalDecisions.Shared.TableLogOnInfo logOnInfo = new CrystalDecisions.Shared.TableLogOnInfo();
int i = 0;
for(i = 0;i <source.Database.Tables.Count; i ++)
{
//设置服务器名
logOnInfo.ConnectionInfo.ServerName = "bssrv";
//数据源
logOnInfo.ConnectionInfo.DatabaseName = "sbms";
//登录名
logOnInfo.ConnectionInfo.UserID = "sa";
//密码
logOnInfo.ConnectionInfo.Password = ""; source.Database.Tables[i].ApplyLogOnInfo(logOnInfo);
}
//设置子报表
for(i= 0;i<source.ReportDefinition.ReportObjects.Count;i++)
{
if(source.ReportDefinition.ReportObjects[i].Kind == ReportObjectKind.SubreportObject)
{
ReportDocument subReport = source.OpenSubreport(((SubreportObject)(source.ReportDefinition.ReportObjects[i])).SubreportName);
//子报表
SetDatabaseLogonInfo(subReport);
}
}
}
}
}
这个函数用在 水晶报表 的显示之前。
source.Load("报表路径"),得到source传到上面的函数中去。