找回密码
 立即注册

QQ登录

只需一步,快速开始

来爱清
论坛元老   /  发表于:2015-2-10 16:00  /   查看:7841  /  回复:9
因为行、列不确定,需要在程序里生成,故无法直接在Xml模板文件里定义PageHeader、Detail部分。
C1Report绑定DataTable为数据源后,如何根据DataTable的列、内容来动态定义和渲染报表?
  1. c1Report.Load(templatePath, reportName);
  2. c1Report.DataSource.Recordset = dataTable;
复制代码

9 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-2-10 16:31:00
沙发
回复 1楼来爱清的帖子

C1Report有两种生成报表的方式,一种就是通过Load方法导入一个已经生成的xml文件,另外一种就是通过代码创建报表。
就你提出的需求来看,你需要第二种方式。
C1Report.Sections[SectionTypeEnum.PageHeader]可以创建PageHeader。
C1Report.Sections[SectionTypeEnum.Detail]可以创建Detail部分。
Field f = section.Fields.Add("LblFirstName", "First", 500, 50, 900, 300); 可以在PageHeader或Detail上添加一个Field,然后指定数据库里的字段。

安装产品后,可以在如下路径找到详细的示例:
\Documents\ComponentOne Samples\Studio for WPF\C1.WPF.C1Report\C1WPFReport\CS\CreateReport
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2015-2-10 17:21:00
板凳
  1.                 #region 填充页内容 Detail
  2.                 Field f;
  3.                 s = c1r.Sections[SectionTypeEnum.Detail];
  4.                 s.Visible = true;
  5.                 double RelativeLeft = 50; //列左边距
  6.                 for (int j = 0; j < dataTable.Columns.Count; j++)
  7.                 {
  8.                     string label = "Fld" + dataTable.Columns[j].ColumnName;
  9.                     f = s.Fields.Add(label, dataTable.Columns[j].ColumnName, RelativeLeft, 50, 1000, 500);
  10.                     f.WordWrap = true;
  11.                     f.Align = FieldAlignEnum.CenterMiddle;
  12.                     f.Calculated = true;
  13.                     RelativeLeft += 1000;
  14.                 }
  15.                 #endregion
复制代码

我用上述代码,试图创建 Detail 部分的Field。但预览时发现,结果全是1、2、3等数字……
  1.       var dataTable = new DataTable();
  2.             //初始化列
  3.             for (int c = 1; c <= 10; c++)
  4.             {
  5.                 dataTable.Columns.Add(c.ToString(), typeof(string));
  6.             }
  7.            //逐行填充内容……
复制代码
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-2-10 18:35:00
地板
回复 3楼来爱清的帖子

从代码来看,你的测试dataTable只有一列,就是1,2,3等数字组成的。
报表展示的就是数据源里的内容。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2015-2-10 19:08:00
5#
我的dataTable是有数据的,结构如下截图



而且我创建页头 PageHeader部分也没问题,就是绑定对应列数据,绑定不了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-2-11 09:11:00
6#
回复 5楼来爱清的帖子

请将你出错的Sample发给我,我帮你看看原因出在哪里。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2015-2-11 11:00:00
7#

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-2-11 11:56:00
8#
回复 7楼来爱清的帖子

推测是应为名字不能用以数字开头的,数据源里创建列的列名都是纯数字,前面加了个字母,就可以正常绑定了。
代码改成如下:
  1. public DataTable GetDataTable()
  2.         {
  3.             DataTable dataTable = new DataTable();
  4.             //初始化列
  5.             for (int c = 1; c <= 9; c++)
  6.             {
  7.                 dataTable.Columns.Add("A"+c.ToString(), typeof(string));
  8.             }
  9. //这里还是原来的代码不变。
  10.             return dataTable;
  11.         }
复制代码

评分

参与人数 1满意度 +5 收起 理由
来爱清 + 5 很满意,非常感谢。

查看全部评分

请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
来爱清
论坛元老   /  发表于:2015-2-12 22:42:00
9#
问题已解决:列名称用纯数字确实无法正常绑定。感谢版主的解答。
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-2-13 09:11:00
10#
回复 9楼来爱清的帖子

谢谢你的反馈。
此问题结束,如果有新问题请开新帖。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部