读书人

~小弟我所遇到的WINFORM下水晶报表有关

发布时间: 2012-02-13 17:20:26 作者: rapoo

~~~我所遇到的WINFORM下水晶报表问题,UP有分
最近开发遇到水晶报表的问题,查阅了些相关资料,有些虽理解犹欠佳,帖出来希望共勉.亦希望有人解惑.,UP有分.

1.在pull模式下,直接连接数据库,即oledb,水晶报表里的字段是直接从【字段资源管理器】下的【数据库字段】拖过去的,关联的是Products表,Form窗体load时的代码如下,测试通过:
reportDocument1 = new CrystalDecisions.CrystalReports.Engine.ReportDocument();
reportDocument1.Load(@ "E:\z7z8\Test1\myTestRpt1.rpt ");
#region 解决登陆
//foreach(CrystalDecisions.CrystalReports.Engine.Table tb in reportDocument1.Database.Tables)
//{
//CrystalDecisions.Shared.TableLogOnInfo logininfo=tb.LogOnInfo;
//logininfo.ConnectionInfo.ServerName=@ "C47ED435468B448\DONGWEI ";
//logininfo.ConnectionInfo.DatabaseName= "Northwind ";
//logininfo.ConnectionInfo.UserID= "sa ";
//logininfo.ConnectionInfo.Password= " ";
//tb.ApplyLogOnInfo(logininfo);
//}
#endregion
crystalReportViewer1.ReportSource=reportDocument1;

我的疑问是:我看教程的时候,讲到必须要验证,也就是我注释的那一段,但是我注释后依然能正常运行.请问这是为什么?

2.在用PUSH模型时,需要自己建立XSD文件,这是一个XML类型的文件,他存储的数据源的结构,此时水晶报表里的字段是通过ADO.NET连接获取的,关联的也是products表,测试通过的代码如下:

SqlConnection conn = new SqlConnection( "server=(local)\\dongwei;database=northwind;Trusted_Connection=yes ");
conn.Open();
SqlCommand com = new SqlCommand( "select * from products ",conn);
SqlDataAdapter ada = new SqlDataAdapter(com);
myDataset1 m= new myDataset1();//强类型化数据集
ada.Fill(m, "products ");
myReport2 m2 = new myReport2();
m2.SetDataSource(m.Tables[0]);
this.crystalReportViewer1.ReportSource=m2;
this.crystalReportViewer1.RefreshReport();,

我想问的是,我能不能使用类型化数据集,自己生成相关的XML文件,然后进行绑定.我的代码如下:

System.Data.DataSet ds = new System.Data.DataSet();
ds.Tables.Add(myDt);//myDt是我用来封装数据的dataTable,此时里面已经存在数据
ds.WriteXml( "myDt.Xml ",System.Data.XmlWriteMode.WriteSchema);
myRpt3.SetDataSource( "myDt.Xml ");//水晶报表里没有拖入字段
this.crystalReportViewer1.ReportSource=myRpt3;
this.crystalReportViewer1.RefreshReport();

如果可以使用弱类型化数据集,我上面的这段代码应该如何更改,谢谢~~~


[解决办法]
up
[解决办法]
看着累啊
[解决办法]
为啥不用push的方法
[解决办法]
up
[解决办法]
up
[解决办法]
我的疑问是:我看教程的时候,讲到必须要验证,也就是我注释的那一段,但是我注释后依然能正常运行.请问这是为什么?

----------------------------------------------
那是因为你还没有部署,只是本机运行,其他机子访问你就会提示输入帐号密码的
[解决办法]
我只用过push模式

该模式通过XSD文件来设计报表 运行时刻连接数据库取得数据集即可
[解决办法]
mark 吧, 水晶报表只是半通水
[解决办法]
1、报表记住了你操作时连接的那个啊,如果你需要连接其它的,或者数据库密码变了,你看它出不出连接对话框!
2、我不知道你这样后,那报表怎么设计的?

[解决办法]
不懂,

[解决办法]


------解决方案--------------------


学习,学习。
[解决办法]
顶一下,顺便学习
[解决办法]
学习了
[解决办法]
Up先~
[解决办法]
upup
[解决办法]
up
[解决办法]
捣腾了这么久都没有结帖,真搞不懂CSDN是怎么回事,标准答案来了:
第一个问题:水晶报表可以预存数据,你使用Pull模式直接拉了数据保存报表时候已经连数据一起保存了,你把代码注释掉之后,你打开报表看到的是连数据一起保存之后的报表,你不妨改一下数据库里的数据,会看到报表还是没变,因为报表根本就没有连上数据库,显示给你看的是当时保存的旧数据.解决办法:用水晶报表独立版本(非.NET自带的设计器),取消 "文件 "菜单下的 "将数据与报表一起保存 "的选项,重新保存报表,再打开网页的时候你会发现登录窗口又出现了.
第二个问题:看来你没有理解清楚Push和Pull模式的区别.myRpt3.SetDataSource( "myDt.Xml ");//水晶报表里没有拖入字段,水晶报表如果没有拖入字段,不管你用哪种模式,都是看不到任何东西的.水晶报表没有动态绑定数据出现数据列的功能,所有的列都是要求你设计的时候拖放在上面的.
像你的这段代码,你用的就是Push模式,Pull和Push模式的区别在于:
Pull模式是指水晶报表主动去把数据 "拉 "回来,数据跟.NET没有关系,水晶报表主动接收数据.
Push模式是指.NET把数据先 "拉 "回来,然后推给水晶报表,水晶报表被动接收数据

两个模式区别在于,前者是水晶报表拉数据回来,后者是.NET拉数据回来,然后推给水晶报表.你的代码中
SqlConnection conn = new SqlConnection( "server=(local)\\dongwei;database=northwind;Trusted_Connection=yes ");
conn.Open();
SqlCommand com = new SqlCommand( "select * from products ",conn);
SqlDataAdapter ada = new SqlDataAdapter(com);
myDataset1 m= new myDataset1();//强类型化数据集
ada.Fill(m, "products ");
myReport2 m2 = new myReport2();
m2.SetDataSource(m.Tables[0]);

就是表明拉数据是由.NET代码完成的.所以属于推模式

[解决办法]
我的做法是:
1 建立一个xsd文件里建一个datatable,列由自己输入,
2 建立一个.rpt文件,数据源定为datatable
3 通过代码向datatable里传数据,
while(ds.read())
{
xsd1.datatable1.rows.add(new object[] {ds[0].tostring(),ds[1].tostring()....});
}

[解决办法]
捣腾了这么久都没有结帖,真搞不懂CSDN是怎么回事
呵呵

读书人网 >.NET

热点推荐