找回密码
 立即注册

QQ登录

只需一步,快速开始

xinqinglhj

中级会员

19

主题

89

帖子

653

积分

中级会员

积分
653
xinqinglhj
中级会员   /  发表于:2020-4-3 10:39  /   查看:4513  /  回复:9
1金币


目前所有报表都已经做好,但是开始没有考虑到装订线,所以打印时需要将报表打印在纸张上的位置,右下移动一定的位置。
尝试过方法1:
在共通统一修改PageSetting.Margin的Left和Top属性,这样可以解决部分报表,但是有些报表一页的内容会出现两页。
这样可能还需要单独调整出现问题的报表。

尝试过方法2:
所以考虑设置打印纸张的位置。设置属性:Document.PrintOption.Margin ,在调试过程中发现有时好使有时不好使,请问这个属性应该如何使用?

这两种方法有何不同?


最佳答案

查看完整内容

通过修改共通,统一调整报表右下移动。 1.方案1 [*]float fTop = rpt.PageSettings.Margins.Top; [*] float fLeft = rpt.PageSettings.Margins.Left; [*] [*] rpt.PageSettings.Margins.Top = fTop + GrapeCity.ActiveReports.SectionReport.CmToInch(m_dTopHeight); [*] rpt.PageSettings.Margins.Left = fLeft + GrapeCity.ActiveReports.SectionReport.CmToInch(m_dLeftWitdh); 复制代码 此方 ...

10 个回复

倒序浏览
最佳答案
最佳答案
KearneyKang讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-4-3 10:39:39
来自 8#
本帖最后由 KearneyOne 于 2020-9-14 16:34 编辑

通过修改共通,统一调整报表右下移动。

1.方案1

  • float fTop = rpt.PageSettings.Margins.Top;
  •     float fLeft = rpt.PageSettings.Margins.Left;
  •     rpt.PageSettings.Margins.Top = fTop + GrapeCity.ActiveReports.SectionReport.CmToInch(m_dTopHeight);
  •     rpt.PageSettings.Margins.Left = fLeft + GrapeCity.ActiveReports.SectionReport.CmToInch(m_dLeftWitdh);

复制代码


    此方案,会导致原来现实在一页内容,分两页显示。同样影响打印预览页(有可能出现红线)



2.方案2

  • // 我尝试下面方式不起作用,但是在debug中修改Margin的数据有效。猜测内部在封装时候,赋值和使用的不是同一个东西。
  •     // 所以尝试采用下面的方案,完美解决我的问题。
  •     // argReport.Document.PrintOptions.Margin = new GrapeCity.ActiveReports.Extensibility.Printing.Margin(fLeft, 0, fTop, 0);
  •     // 采用方案:通过反射修改私有属性的值。
  •     // 左部余白
  •     CallPrivateMethod(((SectionReport)argReport).Document.PrintOptions.Margin, "set_Left", new object[1] { fLeft });
  •     // 上部余白
  •     CallPrivateMethod(((SectionReport)argReport).Document.PrintOptions.Margin, "set_Top", new object[1] { fTop });
  •     // 通过反射修改私有属性的值。
  •     private void CallPrivateMethod(object instance, string propertyName, params object[] param)
  •     {
  •         BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
  •         Type type = instance.GetType();
  •         MethodInfo method = type.GetMethod(propertyName, flag);
  •         method.Invoke(instance, param);
  •     }

复制代码
回复 使用道具 举报
KearneyKang讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-4-3 14:36:38
2#
你好,根据你的反馈第一种方法第二种办法,其实都是设置打印的时候一个左边距的问题,其实也就是设置的报表的左边距。
出现两页是因为你那部分报表的宽度没设置够,然后打印的时候边距占了一定的报表宽度,报表本来的页面一页展示不全,导致的分页。所以你这样设置 可能就是你说的需要自己再调整下报表设计纸张宽度
两种方式的理念方式基本是一样的,都是修改报表本身打印页面的边距来实现
回复 使用道具 举报
xinqinglhj
中级会员   /  发表于:2020-4-3 15:46:37
3#
KearneyKang 发表于 2020-4-3 14:36
你好,根据你的反馈第一种方法第二种办法,其实都是设置打印的时候一个左边距的问题,其实也就是设置的报表 ...

为什么第二种方式,debug调试中修改对象的Left和TOP好用,通过代码修改这两个属性就不好用呢?

第二种方式如果打印不开不会出现两页。
回复 使用道具 举报
KearneyKang讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-4-7 10:00:41
4#
回复 使用道具 举报
xinqinglhj
中级会员   /  发表于:2020-4-7 11:17:43
5#
KearneyKang 发表于 2020-4-7 10:00
你好,ACtiveReports打印的后端代码的设置目前就是这样设置的:通过这样设置打印纸张的上下左右的边距。

我测试设置printer的DefaultPageSettings的这种方式感觉不靠谱(测试只设置了Top和Left),不知道是不是我设置的问题。debug到测试地方,top和left的默认值都是100,修改其他数据之后,不起任何作用。

目前已经通过我的第二种方式解决了,开始是用构造函数传递top和left不起作用。官方有没有提供其他公开方法,之后通过设置私有属性的方式解决。

感觉这应该是一个bug了,官方有可能在利用封装的时候,内部使用乱了,(私有变量和公有属性用乱了,导致通过构造函数设置无效)
回复 使用道具 举报
KearneyKang讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-4-7 14:03:04
6#
你好,谢谢谢你的分享。你能详细提供下你是如何使用代码解决这个问题的方法吗。非常期待你的分享
回复 使用道具 举报
xinqinglhj
中级会员   /  发表于:2020-4-14 12:44:49
7#
本帖最后由 xinqinglhj 于 2020-4-14 12:46 编辑
KearneyKang 发表于 2020-4-7 14:03
你好,谢谢谢你的分享。你能详细提供下你是如何使用代码解决这个问题的方法吗。非常期待你的分享

不好意思回复晚了。

通过修改共通,统一调整报表右下移动。

1.方案1

  1. float fTop = rpt.PageSettings.Margins.Top;
  2.     float fLeft = rpt.PageSettings.Margins.Left;

  3.     rpt.PageSettings.Margins.Top = fTop + GrapeCity.ActiveReports.SectionReport.CmToInch(m_dTopHeight);
  4.     rpt.PageSettings.Margins.Left = fLeft + GrapeCity.ActiveReports.SectionReport.CmToInch(m_dLeftWitdh);
复制代码


    此方案,会导致原来现实在一页内容,分两页显示。同样影响打印预览页(有可能出现红线)



2.方案2

  1. // 我尝试下面方式不起作用,但是在debug中修改Margin的数据有效。猜测内部在封装时候,赋值和使用的不是同一个东西。
  2.     // 所以尝试采用下面的方案,完美解决我的问题。
  3.     // argReport.Document.PrintOptions.Margin = new GrapeCity.ActiveReports.Extensibility.Printing.Margin(fLeft, 0, fTop, 0);


  4.     // 采用方案:通过反射修改私有属性的值。
  5.     // 左部余白
  6.     CallPrivateMethod(((SectionReport)argReport).Document.PrintOptions.Margin, "set_Left", new object[1] { fLeft });

  7.     // 上部余白
  8.     CallPrivateMethod(((SectionReport)argReport).Document.PrintOptions.Margin, "set_Top", new object[1] { fTop });

  9.     // 通过反射修改私有属性的值。
  10.     private void CallPrivateMethod(object instance, string propertyName, params object[] param)
  11.     {
  12.         BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic;
  13.         Type type = instance.GetType();
  14.         MethodInfo method = type.GetMethod(propertyName, flag);
  15.         method.Invoke(instance, param);
  16.     }
复制代码


点评

非常给力  发表于 2020-4-14 13:45

评分

参与人数 1金币 +500 收起 理由
KearneyKang + 500 很给力!

查看全部评分

回复 使用道具 举报
xinqinglhj
中级会员   /  发表于:2020-4-14 14:33:30
9#
回复 使用道具 举报
KearneyKang讲师达人认证 悬赏达人认证
超级版主   /  发表于:2020-4-14 17:08:53
10#
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部