|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
以前很热炒跨平台,主要是由于硅谷挑战微软霸主地位的热情,但是冷静下来后,跨平台往往不是那么一回事。假设你有个软件,所谓的跨平台,你只需要为第二个平台上重新编译一次就行了,这样很难么?有良多良多次被问到:
为何水晶报表那末贫苦,每做一张报表都要选表,画线画格子,有无一种办法能够与日俱增?
做一个模板,然后用分歧的表都能用?
另有就是能不克不及静态选择列,并且选择列后能报表能主动合用这个变更?
乃至有些人也由于保持了水晶报表,实践上这些都是水晶报表能够做到的。</p><p>我之前曾零星地写过几篇,在论坛和博客中都曾重复解说过思绪,可是并没有体系地往办理这个成绩,在这里,我来说解一下道理和完成。
但愿该文章,能基础上办理这个成绩。固然,这个也不是全能的,也有其合用情况。
本文开辟情况:VS2005/CRXIR2for.Net
第一步:新建一个C#的水晶报表的WinForm空缺项目。在弹出报表数据源选择框的时分,不要选择任何任何数据源,间接点断定,创立一个空缺报表。
第二步:项目中增加一个Dataset1.xsd,手工创建一个DataTable,定名为BigTable。创建6个字段,全体为String型。
为何用6个呢?这个数字6切实其实立,是依据你的实践必要,这个表的列的数量,必要年夜于即是你所必要操纵的现实表的最年夜列数。
用为何用String型呢?我们晓得基础上一切的基本数据范例都能够转换为String,如许我们的这个表基础上能够包容一切的数据范例。
好了,在报表中增加这个Bigtable.
将6个字段拖到具体材料节。对齐。
注重!不要利用框和线来画格子,这里用的是字段边框,初度操纵能够临时不必,我前面会专门讲一下这个格线的处置。
好了,如许我们的全能模板就做成了。很复杂,是吗?呵呵。
第三步:在winform上拖上一个combox,一个button,用默许称号接口。
combox1用来选表的称号。
如许界面也完成了。
第四步:完成道理
下面的几步上去,有履历的伴侣基础上看出来我们是要用PUSH形式来完成了。
既然我们已在报内外用到了BigTable,那末我们要传送给报表的数据,也就要整构成BigTable的模样。
也就是说,只需能把来历数据表的数据,整构成BigTable的模样,就可以用这一个模板显现出来。
而不必管来历表从那里来,表名是甚么,有几个字段(可是字段数量必要小于即是6),字段名是甚么,有几数据。
从而到达全能的目标。
我把这个事情复杂封装了一下,做了个小办法。classclsDyCrystalReportCore
{
///<summary>
///将传进的datatable转换成报表模板所必要的datatable
///数据全体转换为string
///</summary>
///<paramname="dt">来历表</param>
///<returns>报表模板所必要的datatable</returns>
publicDataTabledtx(DataTabledt)
{
DataSet1.BigTatableDataTabledtx1=newDataSet1.BigTatableDataTable();
object[]obj=newobject[dt.Columns.Count];
//出格注重:所选择的表的列的数量需<=Bigtable的字段数量
//请自行填写回护代码
for(inti=0;i<dt.Rows.Count;i++)
{
dtx1.Rows.Add(dtx1.NewRow());
for(intj=0;j<dt.Columns.Count;j++)
{
dtx1.Rows[j]=dt.Rows[j].ToString();
}
}
returndtx1;
}
}
就是来历表依照BigTable的布局写到BigTable内里往。很复杂的代码,但也是这个计划的中心。
第五步:功效完成。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Text;
usingSystem.Windows.Forms;
usingCrystalDecisions.Shared;
usingCrystalDecisions.CrystalReports.Engine;
usingCrystalDecisions.Windows.Forms;
usingSystem.Data.OleDb;
namespaceDyCrystalReportDemo
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
privatevoidbutton1_Click(objectsender,EventArgse)
{
StringtblName=comboBox1.Text;
Stringconnstr="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="+System.Threading.Thread.GetDomain().BaseDirectory+"bbtcrall.mdb"+";";
if(tblName=="")
{
MessageBox.Show("请选择表名");
comboBox1.Focus();
return;
}
//翻开数据库毗连
DataTabledt1=newDataTable();
DataTabledtx=newDataTable();
OleDbDataAdapterda=newOleDbDataAdapter();
OleDbConnectioncn=newOleDbConnection(connstr);
//翻开选择的表(注重举行毛病回护)40
//假如要完成恣意列,只需变动此处的SQL为详细的字段便可
da=newOleDbDataAdapter("SELECT*From"+tblName,cn);
da.Fill(dt1);
//处置ds1
clsDyCrystalReportCorexCore=newclsDyCrystalReportCore();
dtx=xCore.dtx(dt1);
ReportDocumentmyReport=newReportDocument();
stringreportPath=System.Threading.Thread.GetDomain().BaseDirectory+"crystalreport1.rpt";
myReport.Load(reportPath);
//绑定命据集,注重,一个报表用一个数据集。54
myReport.SetDataSource(dtx);
crystalReportViewer1.ReportSource=myReport;
crystalReportViewer1.RefreshReport();
}
privatevoidForm1_Load(objectsender,EventArgse)
{
comboBox1.Items.Add("Test1_1");
comboBox1.Items.Add("Test1_2");
}
}
}
其他:
1:稍晚些我会把格线的处置完美一下
2:静态完成也能够利用开辟版或水晶报表2008用API增加,可是要比这个贫苦多了。
3:本例子不合用于年夜数据量操纵。
竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。 |
|