xtrareport实现指定记录数以及填补空白行(网上整理)

2024-01-17 20:59

本文主要是介绍xtrareport实现指定记录数以及填补空白行(网上整理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Detail的事件中:

int i=0;
private void OnBeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
   //控制每页报表显示的条数
if (i!=0&&i%8==0) //每页显示8条
{
  Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.BeforeBand;  
}
else
{
  Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.None;   
}
i++;
}


在Table的事件中:

private void OnBeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
  //数据集“StorageBillMatItem”进行替换即可
 if(i==((System.Data.DataSet)(xtraReport1.DataSource)).Tables["StorageBillMatItem"].Rows.Count)
   {
      XRTable table = xrTable2;//Template Detail Band XRTable
      int iheight = table.Rows[table.Rows.Count - 1].Height;


      int SpaceRowCount = 8-(i)%8;
      XRTableRow[] xrRow = new XRTableRow[SpaceRowCount];


      for(int k=0;k<SpaceRowCount ;k++)
        {
            xrRow[k] = new XRTableRow();
            xrRow[k].Size = new Size(table.Width, iheight);
            xrRow[k].Location = new Point(table.Location.X, k * iheight);
            xrRow[k].Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top);
            xrRow[k].BorderWidth = 1;
            xrRow[k].BorderColor = table.Rows[table.Rows.Count - 1].BorderColor;
            //CreateCell
            XRTableRow row = table.Rows[table.Rows.Count - 1];
            CreateCellArray(xrRow[k], row);
       } 
      xrTable2.Rows.AddRange(xrRow); 
   }  
}


/// <summary>
/// CreateCell
/// </summary>
/// <param name="xrRow">Current Row</param>
/// <param name="xrRowTemplate">Row Template</param>
private void CreateCellArray(XRTableRow xrRow, XRTableRow xrRowTemplate)
{
    int Xmargin = 0;
    for (int i = 0; i < xrRowTemplate.Cells.Count; i++)
    {
        XRTableCell xrcell = new XRTableCell();
        xrcell.BorderWidth = 1;
        xrcell.Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top);
        xrcell.Width = xrRowTemplate.Cells[i].Width;
        xrcell.BackColor = xrRowTemplate.Cells[i].BackColor;
        xrcell.Height = xrRowTemplate.Height;
        if (i != 0)
        {
            xrcell.Location = new Point(Convert.ToInt32(Xmargin + xrRowTemplate.Cells[i].Width), 0);
        }
        else
        {
            xrcell.Location = new Point(0, 0);
        }
        xrRow.Cells.Add(xrcell);
    }
}

http://www.dxper.net/documents/html/DevExpressXtraReportsUIXtraReport_ScriptLanguagetopic.htm

用DevExpress.XtraReports实现复杂报表套打的一些经验

我觉得首先需要了解打印的一些常识和DevExpress.XtraReports的打印逻辑:
      1.PageHeader和PageFooter高度是固定的,Detail高度是变的,所以嵌套的数据源一般放到Detail中;
      2.报表的分页按照两个原则:首先最外层的是根据Report的数据源的RowChanged,内层是根据数据源的每个Row的填充结果,如果数据填满整个页还没打印完,就会分页打印到下一页;

然后就说一下套打。套打比较麻烦的是单据内数据的定位,假如有N张报表,每张报表上又需要N个控件,通过打印测试比对修改的方式肯定行不通,在XtraReports中可以通过加背景图片的方式定位控件,分几个步骤:
      1.将所有单据报表按1:1扫描;
      2.在一张空的报表中拖入一个XRPictureBox控件,设置控件的Image属性为任一张报表图片,设置Sizing属性为ZoomImage,并将控件占满整个报表;
      3.打印测试比对,直到打印出的图片和实际单据完全一致,通过图片的长宽属性和XRPictureBox控件的长宽属性计算出比值;
      4.将3中计算出的比值应用到其他报表扫描图片上,再将图片作为报表背景定位各个数据控件的位置。


下面举一个我做的单据中一个比较复杂一点的例子,如下图:

      这张单据的难点首先是存在两个高度不确定的部分:“托运人提供详细情况”和“运费与附加费”。这两部分的数据分别存在单独的表中,记录数不定。对于这种情况,为了使整体结构清晰,我一般把不确定的部分放到SubReport中。我尝试放了两个SubReport,然而XtraReports的打印逻辑是先打印完上面的SubReport然后才打印下面的SubReport,和单据情况不符,失败。(不知这种情况谁有比较好的解决方案)问题无法解决,我又分析了一下需求,问了客户的情况,了解到"运费与附加费"记录数很少,一般两三条,最多也不会到引起分页的地步,我调整了一下,把下面的SubReport改为包含6个Row的固定高度的XtrTable,并将“集装箱数或件数合计”一下全部并入PageFooter,问题一解决。

      不久客户说红框框中的部分放一个主表的字段,是一个多行文本,且print per page,所以红框框中这部分不能放在SubReport中了,放在外面,因为在Report中SubReport没有Left属性(SubReport都是从Report的最左边开始打印),SubReport也不能用了,最后只好放了一个XtrTable,只包含一个Row,然后根据记录数在BeforePrint事件中动态添加Row。到这里整张单据基本完成了。

 
代码:
int i=0;
private void OnBeforePrint1(object sender, System.Drawing.Printing.PrintEventArgs e) {
   //控制每页报表显示的条数
if (i!=0&&i%19==0) //每页显示19条
{
  Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.BeforeBand;  
}
else
{
  Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.None;   
}
i++;
}


private void OnBeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
  
      Purchaseordersheet obj = (Purchaseordersheet)Report1.GetCurrentRow();
           //定义采购申请        
     //  Purchaserequisition ent;
     //     获取当前采购申请的行数
     // ent=(Purchaserequisition)Detail   Report.GetCurrentRow(); obj .Purchaserequisitions.Count
     //判断变量是否等于采购申请的行数
      if(i==obj.Purchaserequisitions.Count&& i<19)   {
      XRTable table = table1;//Template Detail Band XRTable
      //int iheight = table.Rows[table.Rows.Count-1].Height;
int iheight = table.Rows[0].Height;
      int SpaceRowCount = 19-(i)%19;
      XRTableRow[] xrRow = new XRTableRow[SpaceRowCount];
    
      for(int k=0;k<SpaceRowCount ;k++)
        {
            xrRow[k] = new XRTableRow();
            xrRow[k].Size = new Size(table.Width, iheight);
            xrRow[k].Location = new Point(table.Location.X, k * iheight);
            xrRow[k].Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top);
            xrRow[k].BorderWidth = 1;
            xrRow[k].BorderColor = table.Rows[table.Rows.Count - 1].BorderColor;
                     
            //CreateCell
            XRTableRow row = table.Rows[table.Rows.Count - 1];
            CreateCellArray(xrRow[k], row);
       } 
            table.Rows.AddRange(xrRow); 
   }  
}

/// <summary>
/// CreateCell
/// </summary>
/// <param name="xrRow">Current Row</param>
/// <param name="xrRowTemplate">Row Template</param>
private void CreateCellArray(XRTableRow xrRow, XRTableRow xrRowTemplate)
{
        int Xmargin = 0;
        for (int i = 0; i < xrRowTemplate.Cells.Count; i++)
       {
        XRTableCell xrcell = new XRTableCell();      
        xrcell.BorderWidth = 1;
        xrcell.Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top);
        xrcell.Width = xrRowTemplate.Cells.Width;
        xrcell.BackColor = xrRowTemplate.Cells.BackColor;
        //xrcell.Height =xrRowTemplate.Height;
       //xrcell.BackColor = Color.Red;
       
        xrcell.Text = " ";
        xrcell.Font = new System.Drawing.Font("宋体", 9.75F);
           if (i != 0)
        {
            xrcell.Location = new Point(Convert.ToInt32(Xmargin + xrRowTemplate.Cells.Width), 0);
        }
        else
        {
            xrcell.Location = new Point(0, 0);
        }
        xrRow.Cells.Add(xrcell);
    }
}



Devexpress 版本:10.2.5

 

先看实现效果

当报表数据不满一页时,填补空行 

XtraReports 报表记录不满一页时填补空行_第1张图片 

当报表数据超过一页时,最后一页填补空行

XtraReports 报表记录不满一页时填补空行_第2张图片 

 

 代码: 

 

XtraReport rpt   =     new   XtraReport();  //   建立报表实例 
rpt.FillEmptySpace   +=     new   BandEventHandler(rpt_FillEmptySpace);  //  绑定填充空行的事件  

 

对应的事件代码:

 

 

void   rpt_FillEmptySpace(  object   sender, BandEventArgs e)
{
    XRTable table 
  =   tableDetail;  //  Template Detail Band XRTable 
      int   iheight   =   table.Rows[table.Rows.Count   -     1  ].Height;

    XRTable xrTable 
  =     new   XRTable();
    xrTable.Size 
  =     new   Size(table.Width, e.Band.Height   -     1  );
    xrTable.BorderWidth 
  =   table.BorderWidth;
    xrTable.Location 
  =   table.Location;
    xrTable.BackColor 
  =   table.BackColor;

    
  int   SpaceRowCount   =   e.Band.Height   /   iheight;

    XRTableRow[] xrRow 
  =     new   XRTableRow[SpaceRowCount];

    
  if   (SpaceRowCount   >     0  )
    {
        
  for   (  int   i   =     0  ; i   <   SpaceRowCount; i  ++  )
        {
            xrRow[i] 
  =     new   XRTableRow();
            xrRow[i].Size 
  =     new   Size(table.Width, iheight);
            xrRow[i].Location 
  =     new   Point(table.Location.X, i   *   iheight);
            xrRow[i].Borders 
  =   (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left   |   BorderSide.Right)   |   BorderSide.Bottom);
            xrRow[i].BorderWidth 
  =     1  ;
            xrRow[i].BorderColor 
  =   table.Rows[table.Rows.Count   -     1  ].BorderColor;
            
  //  CreateCell 
            XRTableRow row   =   table.Rows[table.Rows.Count   -     1  ];
            CreateCellArray(xrRow[i], row);
        }
        xrTable.Rows.AddRange(xrRow);
        e.Band.Controls.Add(xrTable);
    }
}

///     <summary> 
///   CreateCell
///     </summary> 
///     <param name="xrRow">  Current Row  </param> 
///     <param name="xrRowTemplate">  Row Template  </param> 
private     void   CreateCellArray(XRTableRow xrRow, XRTableRow xrRowTemplate)
{
    
  int   Xmargin   =     0  ;
    
  for   (  int   i   =     0  ; i   <   xrRowTemplate.Cells.Count; i  ++  )
    {
        XRTableCell xrcell 
  =     new   XRTableCell();
        xrcell.BorderWidth 
  =     1  ;
        xrcell.Borders 
  =   (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left   |   BorderSide.Right)   |   BorderSide.Bottom);
        xrcell.WidthF 
  =   xrRowTemplate.Cells[i].WidthF;
        xrcell.BackColor 
  =   xrRowTemplate.Cells[i].BackColor;
        xrcell.Height 
  =   xrRowTemplate.Height;
        
  if   (i   !=     0  )
        {
            xrcell.Location 
  =     new   Point(Convert.ToInt32(Xmargin   +   xrRowTemplate.Cells[i].WidthF),   0  );
        }
        
  else 
        {
            xrcell.Location 
  =     new   Point(  0    0  );
        }
        xrRow.Cells.Add(xrcell);
    }
}

 

XtraReports 报表记录不满一页时填补空行


这篇关于xtrareport实现指定记录数以及填补空白行(网上整理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617205

相关文章

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi