xinqinglhj 发表于 2020-4-3 10:39:38

如何通过编码方式设置打印在纸张上的起始位置?



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

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

这两种方法有何不同?


KearneyKang 发表于 2020-4-3 10:39:39

本帖最后由 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 { fLeft });
[*]
[*]    // 上部余白
[*]    CallPrivateMethod(((SectionReport)argReport).Document.PrintOptions.Margin, "set_Top", new object { 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

你好,根据你的反馈第一种方法第二种办法,其实都是设置打印的时候一个左边距的问题,其实也就是设置的报表的左边距。
出现两页是因为你那部分报表的宽度没设置够,然后打印的时候边距占了一定的报表宽度,报表本来的页面一页展示不全,导致的分页。所以你这样设置 可能就是你说的需要自己再调整下报表设计纸张宽度
两种方式的理念方式基本是一样的,都是修改报表本身打印页面的边距来实现

xinqinglhj 发表于 2020-4-3 15:46:37

KearneyKang 发表于 2020-4-3 14:36
你好,根据你的反馈第一种方法第二种办法,其实都是设置打印的时候一个左边距的问题,其实也就是设置的报表 ...

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

第二种方式如果打印不开不会出现两页。

KearneyKang 发表于 2020-4-7 10:00:41

你好,ACtiveReports打印的后端代码的设置目前就是这样设置的:private void tsbPrint_Click(object sender, EventArgs e)
      {
            string file_name = @"..\..\RdlReport1.rdlx";
            GrapeCity.ActiveReports.PageReport pageReport = new GrapeCity.ActiveReports.PageReport(new System.IO.FileInfo(file_name));
            pageReport.Document.LocateDataSource += new LocateDataSourceEventHandler(LocateData);
            pageReport.Document.Printer.DefaultPageSettings.Margins.Bottom = 0;
            pageReport.Document.Printer.DefaultPageSettings.Margins.Left = 0;
            pageReport.Document.Printer.DefaultPageSettings.Margins.Right = 0;
            pageReport.Document.Printer.DefaultPageSettings.Margins.Top = 0;         
            pageReport.Document.Printer.PaperSize.RawKind = 0;
            pageReport.Document.Printer.PaperSize.Width = 14;
            pageReport.Document.Printer.PaperSize.Height = 20;
            pageReport.Document.Printer.PrinterName = "打印机名";
            GrapeCity.ActiveReports.PrintExtension.Print(_document, true, true);

         }

通过这样设置打印纸张的上下左右的边距。

xinqinglhj 发表于 2020-4-7 11:17:43

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

你好,谢谢谢你的分享。你能详细提供下你是如何使用代码解决这个问题的方法吗。非常期待你的分享

xinqinglhj 发表于 2020-4-14 12:44:49

本帖最后由 xinqinglhj 于 2020-4-14 12:46 编辑

KearneyKang 发表于 2020-4-7 14:03
你好,谢谢谢你的分享。你能详细提供下你是如何使用代码解决这个问题的方法吗。非常期待你的分享
不好意思回复晚了。

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

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 { fLeft });

    // 上部余白
    CallPrivateMethod(((SectionReport)argReport).Document.PrintOptions.Margin, "set_Top", new object { 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);
    }

xinqinglhj 发表于 2020-4-14 14:33:30

:lol:lol:lol

KearneyKang 发表于 2020-4-14 17:08:53

:)
页: [1]
查看完整版本: 如何通过编码方式设置打印在纸张上的起始位置?