C# 创建报表过程详解
http://www.jb51.net/article/68481.htm本文给大家介绍的是使用vs2012 c#创建报表的全部过程的记录,十分的详细,有需要的小伙伴可以参考下。
..1、新建windows窗体,项目-->添加新项-->Visual C#项-->Windows Form-->windows窗体。
2、窗体中加入button按钮和报表控件。
3、新建报表,项目-->添加新项-->reporting-->报表,生成.rdlc文件。
4、在.rdlc上插入表格-->新建数据源-->数据库-->数据集-->新建连接,步骤如下:
5、这里输入数据库连接的服务器名,登录数据库的用户名和密码,选择数据库名称。
6、选择需要用的表。
7、名称可以自己写,本人没改,数据源为自己选择的数据库名称,可用数据集为表名。
8、.rdlc界面在表格的第一行输入字段名,第二行点击每列右上角的小图标选择该列要显示的字段名。
9、回到Form窗体点击报表右上角的小三角,选择刚刚创建的报表Report1.rdlc,数据源默认的就可以,本人在这里没有修改数据源名称还是DataSet1.
10、后台代码
public Form1()
{
InitializeComponent();
this.reportViewer1.Load -= new System.EventHandler(this.reportViewer1_Load);
}
private void button1_Click(object sender, EventArgs e)//button点击事件
{
reportViewer1_Load(sender, e);
}
private void Form1_Load(object sender, EventArgs e)
{
this.reportViewer1.Load -= new System.EventHandler(this.reportViewer1_Load);
}
private void reportViewer1_Load(object sender, EventArgs e)
{
DataTable table = helps.GetDataTable("select ID,UserID,OID from User_Org where 1=1");
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet1", table));
this.reportViewer1.RefreshReport();
}
运行程序加载:
点击button
这里写的是点击button后才加载数据。
========
C#中使用RDLC报表(1)
http://blog.csdn.net/panting8/article/details/73205401 建立数据源
启动VS2005新建一个窗体项目,命名为TestProj
在左边的窗体内选择“添加新数据源”或在菜单上操作“添加新数据源”:
选择后出现对话窗体,选择“数据库”,进入“下一步”:
本数据源以SqlServer2000所提供的Northwind数据库为例,因此在数据库内选择驱动程序为SqlServer,具体操作视所用数据库而定(如果连接为Oracle,建议用Oracle所提供的ODP for .NET,地址:http://www.oracle.com/technology/global/cn/software/tech/windows/odpnet/index.html)。
选择数据源后,指定数据库文件,并进行测试,如果连接不通,请检查你的软件设置。
进行下一步,至显示出库文件内的表及视图,然后打开表,并选择其中的Employees,选择完成。
在数据源窗口中显示出所选择表及表内的字段,以备使用。
同时在资源管理器中,也可以看到新增加的数据文件。
2 报表浏览器
在新建的窗体内,放入报表浏览控件:
此报表浏览控件集成了报表查看及打印预览的功能,可直接输出至打印机,也可直接输出至Excel文件或PDF文件,对于喜欢看Excel表格的客户来说,这个报表控件非常不错。关于此报表的来源及台前幕后的各种说法,请自己查询相关的网站。
3 建立报表文件
选中报表浏览器控件后,在控件的右上角会出现一个小三角,点击后,出现一个菜单,选择“设计新报表”或在解决方案资源管理器中添加一个新的报表文件:
双击“报表项”内的“表”,则设计空白表内生成一个表格,我们可以在表格内添加数据项。
此报表的设计方式类似于MS以前的VB下报表设计环境。在报表设计器中,我将一份报表分为五个部分,从上至下为:报表标题区、列标题区、数据显示区、合计及页脚。如果将报表的设计形式显示出页眉及页脚,报表的形式会看得更清楚些:
选择页眉及页脚:
显示结果:
现在开始设计报表:
在“页眉”区内放入一个文本框,将内容更改为“测试报表”,居中,字体放大加粗:
从数据源窗口中选择合适的列,用鼠标拖到报表内的“详细信息”表格上,数据会自动填入:
将设计的报表保存后,返回报表浏览窗口,并为报表浏览器选择我们设计的报表:
选中报表文件后,菜单也有所改变:
再为此报表文件指定数据源,选择数据源:
确定,保存文件并运行测试文件。
4 预览
报表生成后预览如下:
是不是很简单?我们也可以对这个简单的报表进行美化,当然,我加上美化的一些功能后,可能效果更差,但此处只是为了演示用法。
? 为数据加表格。
在报表设计器中,选择需要加表格框的区域
然后在工具栏中选择边框工具
加什么样的框线根据需要,此处我选择“所有框线”。
看上去比原来的灰线能稍黑一些,在预览时就能看出来了。
? 加打印时间显示
加入一个显示打印时间的文本框,在上面按右键,选属性:
在“文件框属性”内,选择“值”后面的表达式生成:
在表达式中选择时间:
不要忘记表达式的前面一定要有一个“=”,如果没有,手工加上一个。为了更符合我们的习惯,前面可以加个说明,如打印时间等,表达式的写法就要稍做改变:还是以“=”开头,后面加上“打印时间:”,再以“&”连接生成的Now函数即可得到我们想要的样子。
? 为行加序号
为了演示,我将序号列加在了表格了最后列
加入一个新的列:
在显示序号的列中输入相关的值:
在此表达式的后面是Nothing,不是null,不要搞错。
三项功能已经完成,预览:
比原来漂亮吗?至少实用了一些。
使用RDLC报表(二)--使用自定义数据集
1 新建窗体
2 建立数据源
3 建立报表
新的数据报表已经生成,下面开始对数据源进行设置。
4 对报表自动生成的数据源进行设置
选择工具栏 à 报表 à 数据源,选中所要修改的数据源后,用“重命名”对其进行修改,如myds。
修改完成后,确定退出此窗口。
选中报表设计器内的表格,显示属性。将表格的数据集名称更改为上面修改的名称。
如果一个报表文件内只有一个数据源,则表格内的数据值可直接写为“=Fields!字段.Value”的格式,如果包含多个数据源,则要对此字段的取值进行指定,如“=(Fields!字段.value,“数据集名称””。
5 手动生成数据源
手动生成的数据集内必须包含报表文件内设计的字段名称,否则会运行出现错误。
生成数据集:
// 报表执行操作
private void button1_Click(object sender, EventArgs e)
{
//取得数据集
string connstring = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True";
System.Data.SqlClient.SqlConnection conn1 = new System.Data.SqlClient.SqlConnection(connstring);
System.Data.SqlClient.SqlCommand command1 = new System.Data.SqlClient.SqlCommand("select * from customers", conn1);
System.Data.SqlClient.SqlDataAdapter ada1 = new System.Data.SqlClient.SqlDataAdapter(command1);
DataSet c_ds = new DataSet();
try
{
conn1.Open();
ada1.Fill(c_ds);
}
finally
{
conn1.Close();
command1.Dispose();
conn1.Dispose();
}
//为报表浏览器指定报表文件
this.reportViewer1.LocalReport.ReportEmbeddedResource = "report.Report1.rdlc";
//指定数据集,数据集名称后为表,不是DataSet类型的数据集
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("myds", c_ds.Tables[0]));
//显示报表
this.reportViewer1.RefreshReport();
}
运行后的数据显示:
使用RDLC报表(三)--向RDLC报表传入参数
在使用报表向客户展示结果数据时,实时的在报表中显示某些特定的数据是必需的,如:显示的部门、打印的日期等。本文只简单的演示向报表内传入一个字符值。如有其它问题,欢迎讨论。
1、新建一个工程TestReport,一个Form窗体,放入一个TextBox、一个Button按钮,再放入一个ReportViewer控件。
2、在ReportViewer上选择新建一个报表
3、在打开的报表设计器中,选择工具栏的“报表”中的“报表参数”,新加一个参数,名称为content,数据类型为string,确定。
4、 在报表设计器的页面上放入一个文本框,在文本框上按鼠标右键->属性,在“文本框属性”窗口中,选择“常规”选项卡内下部的“值”后面的“编辑表达 式”按钮(就是那个Fx),在此窗口内,左下框内选择参数,在右下框将会出现在上一步中设置的参数,双击此参数,在上面的框内将出现所需要的表达 式:=Parameters!content.Value。保存此报表。报表默认名称为Report1.rdlc。
5、在Form窗体内双击按钮,编写如下代码:
this.reportViewer1.LocalReport.ReportEmbeddedResource = "TestReport.Report1.rdlc";
ReportParameter rp = new ReportParameter("content", this.textBox1.Text);
this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { rp });
this.reportViewer1.RefreshReport();
6、运行工程,在文本输入框内输入数据,按下按钮,数据是不是已经传入报表了?
//报表参数
ReportParameter[] RP = new ReportParameter[8];
//报表参数名称
string[] RptParmsName = new string[8] { "p_BillNo", "p_compForshort", "p_LuptDate", "p_compFullname", "p_RecoverSigner", "p_deptname", "p_Issuer", "p_DeliveryDate" };
//报表参数值
object[] RptParmsValue = new object[8] { dt.Rows[0]["BillNo"].ToString(), dt.Rows[0]["compForshort"].ToString(), dt.Rows[0]["LuptDate"], dt.Rows[0]["compFullname"].ToString(), dt.Rows[0]["RecoverSigner"].ToString(), dt.Rows[0]["deptname"].ToString().Trim(), UserName, dt.Rows[0]["DeliveryDate"] };
//为报表传递参数
for (int i = 0; i < RP.Length; i++)
{
RP[i] = new ReportParameter(RptParmsName[i], RptParmsValue[i].ToString());
this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { RP[i] });
}
使用RDLC报表(四)--钻取式报表
本文内以MSServer自带Northwind库文件内的Customers及Orders这两个表为例,建立两个报表文件,在查询得出 Customers的表数据后,点击此表内的CustomerID数据,报表将转入至下一个报表,并显示与之相关的Orders的数据,即VS中所谓的钻 取式报表。
1、打开一个工程,并新建一个From,放入一个Button及一个ReportViewer控件。
2、在工程内新建一个数据源,连接到Northwind库文件,显示Customers及Orders这两个表
3、新建一个报表文件,并以表格的形式来显示数据,将Customers表内的CustomerID、CompanyName及Address三个字段放入,形成一份有表头及数据的简单报表,并将此报表保存命名为customerReport
4、再建一个报表文件,与customerReport相同,也以表格的形式来显示报表,将Orders内的OrderID、CustomerID、ShipName及OrderDate四个字段放入表格内,报表保存为orderReport
5、orderReport的数据源根据主报表customerReport的数据来确定数据源的数据,查看表格的数据集名称,我的显示为NorthwindDataSet_Orders,也可以自己另建一个,具体方法见我的《RDLC报表(二)》
6、 再打开customerReport报表,将CustomerID设置成为可点击的索引字段,以便转入下一个报表。选择CustomerID字段,按鼠标 右键,在”文本框属性“窗口中,选择”导航“选项卡,在下面的”超链接“中选择”跳至报表“,在报表名称中选择”orderReport“,再按下后面 的”参数...“按钮,输入一个参数名称,如customerid,参数值选择=Fields!CustomerID.Value。为了与其它数据相区 分,可以将此列数据根据自己的习惯改变颜色或加下划线
7、在orderReport中,设置一个报表参数,与CurtomerReprot中的名称相同,以接收父表中传入的参数
8、 新建两个取得数据的方法,一个从Customers中取得数据集,另一个从Orders中取得数据集,且带参数。此两个方法可以自己编写类库来实现,也可 以在VS的数据集内添加。为了演示方便,我直接使用了Customers的GetData(),并编写了一个Orders的 GetDataByCustomerID(@cid)的方法。
9、在From的Button中编写如下代码:
private void button2_Click(object sender, EventArgs e)
{
NorthwindDataSet.CustomersDataTable dt1 = new NorthwindDataSetTableAdapters.CustomersTableAdapter().GetData();
this.reportViewer1.LocalReport.ReportEmbeddedResource = "TestReport.customerReport.rdlc";
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("NorthwindDataSet_Customers", dt1));
this.reportViewer1.RefreshReport();
}
10、使用报表的Drillthrough事件,当选择了钻取项时会发生此事件,给下一个报表取值,代码如下:
private void reportViewer1_Drillthrough(object sender, DrillthroughEventArgs e)
{
LocalReport lp = (LocalReport)e.Report;
string customerid = lp.GetParameters()["customerid"].Values[0].Trim();
lp.DataSources.Clear();
lp.DataSources.Add(new ReportDataSource("NorthwindDataSet_Orders",
new NorthwindDataSetTableAdapters.OrdersTableAdapter().GetDataByCustomerID(customerid)));
}
运到结果:
运行第一份报表:
钻取后运行第二份报表:
========
使用RDLC报表(二)--使用自定义数据集
http://blog.csdn.net/panting8/article/details/7320555新建窗体
<!--[if !supportLists]-->2<!--[endif]-->建立数据源
3<!--[endif]-->建立报表
新的数据报表已经生成,下面开始对数据源进行设置。
<!--[if !supportLists]-->4<!--[endif]-->对报表自动生成的数据源进行设置
选择工具栏 à 报表 à 数据源,选中所要修改的数据源后,用“重命名”对其进行修改,如myds。
修改完成后,确定退出此窗口。
选中报表设计器内的表格,显示属性。将表格的数据集名称更改为上面修改的名称。
如果一个报表文件内只有一个数据源,则表格内的数据值可直接写为“=Fields!字段.Value”的格式,如果包含多个数据源,则要对此字段的取值进行指定,如“=(Fields!字段.value,“数据集名称””。
<!--[if !supportLists]-->5<!--[endif]-->手动生成数据源
手动生成的数据集内必须包含报表文件内设计的字段名称,否则会运行出现错误。
生成数据集:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> /// <summary>
/// 报表执行操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//取得数据集
string connstring = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True";
System.Data.SqlClient.SqlConnection conn1 = new System.Data.SqlClient.SqlConnection(connstring);
System.Data.SqlClient.SqlCommand command1 = new System.Data.SqlClient.SqlCommand("select * from customers", conn1);
System.Data.SqlClient.SqlDataAdapter ada1 = new System.Data.SqlClient.SqlDataAdapter(command1);
DataSet c_ds = new DataSet();
try
{
conn1.Open();
ada1.Fill(c_ds);
}
finally
{
conn1.Close();
command1.Dispose();
conn1.Dispose();
}
//为报表浏览器指定报表文件
this.reportViewer1.LocalReport.ReportEmbeddedResource = "report.Report1.rdlc";
//指定数据集,数据集名称后为表,不是DataSet类型的数据集
this.reportViewer1.LocalReport.DataSources.Clear();
this.reportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("myds", c_ds.Tables[0]));
//显示报表
this.reportViewer1.RefreshReport();
}
运行后的数据显示:
========
使用RDLC报表(三)--向RDLC报表传入参数
http://blog.csdn.net/panting8/article/details/7320559在使用报表向客户展示结果数据时,实时的在报表中显示某些特定的数据是必需的,如:显示的部门、打印的日期等。本文只简单的演示向报表内传入一个字符值。如有其它问题,欢迎讨论。
1、新建一个工程TestReport,一个Form窗体,放入一个TextBox、一个Button按钮,再放入一个ReportViewer控件。
2、在ReportViewer上选择新建一个报表
3、在打开的报表设计器中,选择工具栏的“报表”中的“报表参数”,新加一个参数,名称为content,数据类型为string,确定。
4、在报表设计器的页面上放入一个文本框,在文本框上按鼠标右键->属性,在“文本框属性”窗口中,选择“常规”选项卡内下部的“值”后面的“编辑表达式”按钮(就是那个Fx),在此窗口内,左下框内选择参数,在右下框将会出现在上一步中设置的参数,双击此参数,在上面的框内将出现所需要的表达式:=Parameters!content.Value。保存此报表。报表默认名称为Report1.rdlc。
5、在Form窗体内双击按钮,编写如下代码:
this.reportViewer1.LocalReport.ReportEmbeddedResource = "TestReport.Report1.rdlc";
ReportParameter rp = new ReportParameter("content", this.textBox1.Text);
this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { rp });
this.reportViewer1.RefreshReport();
6、运行工程,在文本输入框内输入数据,按下按钮,数据是不是已经传入报表了?
========
ReportViewer动态报表开发完整步骤
http://blog.csdn.net/waterxcfg304/article/details/45788639在朋友的邀请下,给他们公司开发一个简单的公司门户网站。本人都多年没有写ASP.NET C#代码了。这几年都在做数据库和商务智能这块。反正朋友说网站不难,就个简单的展现网站,于是就答应了,找了一天到他们公司去听具体的开发需求,听了需求后,觉得难道不是很大,主要的难点在一个在线租赁平台。朋友的公司是做检测设备租赁的。于是就答应了。承诺在1个月内做好。主要是周末和晚上做。
所有的框架和页面展示功能都还可以,很快就开发好了。但是当在开发打印报表的时候,遇到了就障碍,主要是自己以前做的大多是C/S的开发。B/S的做的不多,更没有开发个B/S报表,而且该报表的数据源是动态的。
于是只能找度娘了,找了好多都没有满足我的要求的,大部分都是简单的直接的从数据库表里拉一个静态表做为数据源。要不就是草草的写点步骤,步骤还不是完整的,误导特大。说误导是我自己按照他们的说法做,调试都不成功,那个心情是想骂娘啊。天不负苦心人。终于搞定了。于是下定决心来写一个完整的步骤。希望能给找这方面需求的朋友能直接按照我的步骤一步一步做下去就可以实现结果。
ReportViewer连接静态的数据表就不说了,下面来写下如何实现让ReportViewer绑定动态的数据源:
一,创建一个Web窗体,命名为WebPrintOrder。 在工具箱里拉一个MicrosoftReportViewer控件到该Web窗体里
1,把MicrosoftReportViewer拉到页面自动生成如下页面代码:
<rsweb:ReportViewer ID="ReportViewer1" runat="server">
</rsweb:ReportViewer>
2,查看页面设计就会显示一个报表控件如下:
二,为报表设置数据源
1,添加RDLC报表控件,名称report.rdlc
2,返回到WebPrintOrder设计界面,点击报表的右上角的>,选择我刚才添加的Report.rdlc如下图:
,3
3,双击选择report.rdlc,这个时候显示的是report.rdlc的设计页面,点击【添加新数据源】,这时候就会显示如下的样式,左边多了一个DataSet1,右侧在App_Code的目录下面多了一个DataSet1.xsd的文件。
4,双击DataSet1.xsd文件,并且在该页面上【右键】添加DataTable显示如下图:
5,我创建了一个名称为PrintOrder的表,然后添加具体的表字段如下图:
6,由于我的报表里需要两个数据源,于是我再次添加数据源如下图:
7,当我点击【添加新数据源】的时候,系统自动又帮我创建了一个DataSet2.xsd 的文件在App_Code下面,如下图:
8,再次双击DataSet2.xsd, 添加新的表如下图:
9,添加一个表名称为RentInfo的表如下:
10,回到report.rdlc设计界面就可以看到两个数据源了,分别叫DataSet1 和 DataSet2
三,开始设计报表
1, 在report.rdlc设计页面,把文本框,折线图和表拖到报表页面上
2,表里的数据直接从网站数据源里把相应的表字段拉到表的明细里就可以了。如下图:
3,这里需要重点介绍的是如何在报表里添加参数,选择【报表】----》【报表参数】 如下图:
4, 我的参数设计如下:
5,上面是报表设计和数据源设计完成,下面来看代码如何和此报表关联起来。
四,报表数据源的绑定代码
[csharp]
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (!string.IsNullOrEmpty(Request.QueryString["ID"]))
{
strRentDateCode = Request.QueryString["ID"].ToString();
}
BindData();
BindPrintOrder();
string CompanyName=Session["Member"].ToString();
QueryParam queryparam = new QueryParam();
if (!string.IsNullOrEmpty(CompanyName))
queryparam.Add("CompanyName", QueryParam.RELATION.EQ, "'" + CompanyName + "'");
memberModel = member.GetMemberModel(CompanyName);
DataTable dtPrintOrder = GetPrintOrderData();
DataTable dtRentInfo = GetRentInfoData();
ReportViewer1.LocalReport.ReportPath = "Report.rdlc";
Microsoft.Reporting.WebForms.ReportDataSource rds = new Microsoft.Reporting.WebForms.ReportDataSource("DataSet1_PrintOrder", dtPrintOrder);
Microsoft.Reporting.WebForms.ReportDataSource rds2 = new Microsoft.Reporting.WebForms.ReportDataSource("DataSet2_RentInfo", dtRentInfo);
//ReportParameter rptParaA = new ReportParameter("rptParaA", "申请日期");
//ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rptParaA });
//ReportParameter rptParaB = new ReportParameter("rptParaB", "公司名称");
//ReportViewer1.LocalReport.SetParameters(new ReportParameter[] { rptParaB });
ReportViewer1.LocalReport.DataSources.Clear();
List<ReportParameter> para = new List<ReportParameter>();
//这里是添加两个字段
para.Add(new ReportParameter("RentDate", strRentDateCode));
para.Add(new ReportParameter("CompanyName", memberModel.CompanyName));
para.Add(new ReportParameter("Address", memberModel.Address));
para.Add(new ReportParameter("Person", memberModel.Person));
para.Add(new ReportParameter("Phone", memberModel.Phone));
para.Add(new ReportParameter("Email", memberModel.Email));
para.Add(new ReportParameter("Count", dtPrintOrder.Rows.Count.ToString()));
this.ReportViewer1.LocalReport.SetParameters(para);
ReportViewer1.LocalReport.DataSources.Add(rds);
ReportViewer1.LocalReport.DataSources.Add(rds2);
this.ReportViewer1.ZoomMode = Microsoft.Reporting.WebForms.ZoomMode.Percent;
this.ReportViewer1.ZoomPercent = 100;
ReportViewer1.LocalReport.Refresh();
}
}
五, 运行程序查看报表如下:
导出成PDF如下:
六,至此ASP.Net C# 动态ReportViewer开发完成。如果您能一直看到这里,我相信您肯定能开发出此类报表。希望此文章能给您帮助。欢迎互相学习!我也是B/S报表开发的二把刀,呵呵!
========