C# FastReport Winform 从设计到调用使用报表全流程
新建字典---保存字典到dictionary.frd文件中,是一个文本文件,记事本打开,主要目的是为报表设计时为拖字段,否则一个空表啥也没有,当然也可以楞写,但会痛苦,提供数据源,即提供向空报表中拖字段的来源
内容如下: 有字段 name,sex,age
一句话: 建立--保存--打开 字典的作用是为设计报表提供方便, 可以拖字典定义的字段, 当然可以手写也没问题遵照规则, 也可以通过连接数据库的数据表来提供报表的拖字段, 具体报表数据量多少完全是在C#中写的查询根据条件能查到多少条记录, 和你在在fastreport设计时提供的设计数据源没有一毛钱关系.
<?xml version="1.0" encoding="utf-8"?> <Dictionary> <TableDataSource Name="baseInfo" ReferenceName="Data.baseInfo" DataType="System.String" Enabled="true"> <Column Name="name" DataType="System.String"/> <Column Name="sex" DataType="System.String"/> <Column Name="age" DataType="System.String"/> </TableDataSource> </Dictionary>
空dictionary.frd只有以下2行
<?xml version="1.0" encoding="utf-8"?>
<Dictionary/>
再没有配置dictionary.frd时,数据选项卡下无东西,无可拖到空报表的字段等东西
依照上面编辑完字典文件后存为比如dictionary1.frd,再打开此字段文件
打开建立并修改数据的字典文件并打开后, 发现多了数据源选项, 为创建报表提供方便
注意这里的表名, 要与在C#中写代码时的DataTable的表的名字一样, 字段也要一样, 否则匹配不上, 会报错,无法提供打印数据
至此,一个简单的报表设计完成
全部的C#调用报表代码
using System; using System.Data; using System.Windows.Forms; namespace _606手写DataTable加FastReport报表 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DataSet ds = new DataSet(); private void btnGenDT_Click(object sender, EventArgs e) { //创建表对象 DataTable dt = new DataTable(); dt.TableName = "baseInfo";//一定要和fastreport Designer设计器中定义字典时的dictionary1.frd中定义的表名对应起来,也可看打开字典后数据源的表名(二者一致) //设置表列 dt.Columns.Add("name");//列的名字也要和字典对应起来,我在这犯错误,字典中用的是name,而在这里C#程序中定义的Datatalbe用的是"姓名"就对应不上了,导致报错,报表无法显示 dt.Columns.Add("sex"); dt.Columns.Add("age"); //先插一行试试 DataRow dr1 = dt.NewRow(); dr1["name"] = "张三"; dr1["sex"] = "男"; dr1["age"] = "18"; dt.Rows.Add(dr1); for (int i = 0; i < 5; i++) { DataRow dr = dt.NewRow(); dr["name"] = "李四~"+i.ToString(); dr["sex"] = i%2==0?"女":"男"; dr["age"] = i+20; dt.Rows.Add(dr); } dataGridView1.DataSource = dt; ds.Tables.Add(dt); #region 测试 ////输出测试 //foreach (DataRow row in dataTable1.Rows) //{ // for (int i = 0; i < dataTable1.Columns.Count; i++) // { // Console.Write(row[i] + " "); // } // Console.WriteLine(); //} //Console.ReadKey(); #endregion } private void btnPrnViewToFT_Click(object sender, EventArgs e) { test(ds); } public void test(DataSet ds) { #region 弃用DataSet与DataTable //// 创建数据表,定义报表字段 //DataSet data = new DataSet(); //DataTable dtt = new DataTable();//创建表 //dtt.TableName = "baseInfo"; //dtt.Columns.Add("patName", typeof(String));//添加列 //dtt.Columns.Add("patSex", typeof(String));//添加列 //dtt.Columns.Add("patAge", typeof(String)); //dtt.Columns.Add("inCode", typeof(String)); //dtt.Columns.Add("outCode", typeof(String)); //dtt.Columns.Add("imageCode", typeof(String)); //dtt.Columns.Add("regId", typeof(String)); //dtt.Columns.Add("deptName", typeof(String)); //dtt.Columns.Add("bedName", typeof(String)); //dtt.Columns.Add("checkItem", typeof(String)); //dtt.Columns.Add("imageDecribe", typeof(String)); //dtt.Columns.Add("imageDiagnose", typeof(String)); //dtt.Columns.Add("suggest", typeof(String)); //dtt.Columns.Add("memo1", typeof(String)); //dtt.Rows.Add(new object[] { baseInfoEntity.patName, // baseInfoEntity.patSex, // baseInfoEntity.patAge, // baseInfoEntity.inCode, // baseInfoEntity.outCode, // baseInfoEntity.imageCode, // baseInfoEntity.regId, // baseInfoEntity.deptName, // baseInfoEntity.bedName, // baseInfoEntity.checkItem, // baseInfoEntity.imageDecribe, // baseInfoEntity.imageDiagnose, // baseInfoEntity.suggest, // baseInfoEntity.memo1 //});//添加行 ////DataView dv = dt.DefaultView;//获取表视图 //data.Tables.Add(dtt); ////string baseString = textBox1.Text.ToString(); #endregion try { FastReport.Report report = new FastReport.Report(); // 检索 Debug\report\Untitled.frx 文件 string filename = @"FastReport4.0\frx1.frx";// Untitled.frx report.Load(filename); report.Preview = this.previewControl1;//让报表显示在窗体的控件中 // 其他数据:data report.RegisterData(ds);//注册数据用DataSet作报表的数据源代码量低,很好,当然用DataTable也可以,麻烦些 //// 图片数据:这个名称,写报表模板里面,自己定义的名称。 //report.SetParameterValue("imageMake", baseInfoEntity.checkDoctor);// 生成显示图片 //report.SetParameterValue("imageCheck", baseInfoEntity.reportDoctor);// 生成显示图片 //report.SetParameterValue("imageIcon", baseInfoEntity.memo2);// 生成显示图片 report.Prepare(); report.ShowPrepared();//共计6行搞定 } catch (Exception err) { MessageBox.Show(err.Message); } } } }
还要注意C#操作报表文件时的以下情形
一个大前提就是要把设计器中提供数据源的数据表的名字和该数据表的字段与在C#中设计打印预览/打印等时保持一样, 这样你在C#为通过查询为报表提供数据源时就是正确显示,否则报错