1. XRTableCell常见属性

  XRTableCell xrTableCell = new XRTableCell();

  A. 字体及字体大小

xrTableCell.Font = new System.Drawing.Font("Arial", FontSize);

  B. 内容是否可以换行

  xrTableCell.WordWrap = False;

C. 文本对齐方式

  xrTableCell.TextAlignment=DevExpress.XtraPrinting.TextAlignment.MiddleLeft;

D. 边框是否显示及边框宽度

xrTableCell.Borders = DevExpress.XtraPrinting.BorderSide.All;

xrTableCell.BorderWidth = 0.5F;

E. 宽度和高度

  xrTableCell.WidthF = 30;

  xrTableCell.HeightF = 30;

  F. XRTableCell文本前景色

xrTableCell.ForeColor=Color.Red;

G. XRTableCell文本内容左右间隔;

  DevExpress.XtraPrinting.PaddingInfo padRight= new DevExpress.XtraPrinting.PaddingInfo();
    padRight.Right = 4;

XRTableCell xrTableCell = new XRTableCell();
    xrTableCell.Padding = padRight;

2. xrTable合并单元格(主要针对旧版本)

在新做的一个页面要用到xrTable合并单元格。我先在Design界面加了一个GroupHeader,随后又在GroupHeader中放了一个XRPanel,最后在XRPanel放入由xrTable嵌套的实现合并XRTableCell的功能,最后导致每一页在切换到下一页时输入很奇怪的一条线,最后查了两三天才发现这个问题。后来经过确认其实不需要加XRPanel的,直接放入嵌套的xrTable就可以了,深刻的教训,值得深思!

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using DevExpress.XtraReports.UI;
using System.Drawing.Printing;
using System.Linq.Expressions; namespace DevExpressConsole
{
public partial class TrendAndReport : DevExpress.XtraReports.UI.XtraReport
{
public TrendAndReport()
{
InitializeComponent();
PrintDocument();
} private void PrintDocument()
{
float TotalWidth = this.PageWidth - this.Margins.Left - this.Margins.Right;
float CellHeight = ;
float CondtWidth = ; for (int i = ; i <= ; i++)
{
XRTable TableContainer = new XRTable();
TableContainer.CanGrow = true;
TableContainer.BeginInit();
for(int j=;j<;j++)
{
XRTableRow TCRow = new XRTableRow();
TCRow.CanGrow = true; XRTableCell OrderNo = new XRTableCell();
OrderNo.CanGrow = true;
OrderNo.WidthF = TotalWidth - CondtWidth - ;
OrderNo.HeightF = CellHeight;
OrderNo.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
OrderNo.ProcessDuplicates = DevExpress.XtraReports.UI.ValueSuppressType.Suppress;
OrderNo.Text = j + + "";
OrderNo.WordWrap = true;
TCRow.Cells.Add(OrderNo); XRTableCell Happy = new XRTableCell();
Happy.CanGrow = true;
Happy.WidthF = ;
Happy.HeightF = CellHeight;
Happy.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
Happy.Text = "I am very happy with this! ";
Happy.WordWrap = true;
TCRow.Cells.Add(Happy); XRTableCell HW = new XRTableCell();
HW.CanGrow = true;
HW.WidthF = ;
HW.HeightF = CellHeight;
HW.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
HW.Text = "Hello World! ";
HW.WordWrap = true;
TCRow.Cells.Add(HW); TableContainer.Rows.Add(TCRow);
}
TableContainer.KeepTogether = true;
TableContainer.AdjustSize();
TableContainer.EndInit(); XRTable xrTab = new XRTable();
xrTab.CanGrow = true;
xrTab.BeginInit();
xrTab.LocationF = new PointF(, + TableContainer.HeightF * i); XRTableRow row = new XRTableRow();
row.CanGrow = true; XRTableCell cell = new XRTableCell();
cell.CanGrow = true;
cell.Borders = DevExpress.XtraPrinting.BorderSide.All;
cell.Controls.Add(TableContainer);
cell.WidthF = TableContainer.WidthF;
row.Cells.Add(cell); XRTableCell CONT = new XRTableCell();
CONT.CanGrow = true;
CONT.Text = "Cont'd";
CONT.WidthF = CondtWidth;
CONT.HeightF = TableContainer.HeightF;
CONT.Angle = ;
CONT.Borders = DevExpress.XtraPrinting.BorderSide.All;
CONT.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
row.Cells.Add(CONT); GroupHeader1.Controls.Add(xrTab);
xrTab.WidthF = TotalWidth;
xrTab.HeightF = TableContainer.HeightF;
xrTab.Rows.Add(row);
xrTab.AdjustSize();
xrTab.EndInit();
}
}
}
}

3. xrTable分页

其实xrTable只要为每个表设置了LocationF属性,就会被自动挤到下一页,为了需要,还是做了一个例子进行确认:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using DevExpress.XtraReports.UI;
using System.Drawing.Printing;
using System.Linq.Expressions; namespace DevExpressConsole
{
public partial class TrendAndReport : DevExpress.XtraReports.UI.XtraReport
{
int k = ;
public TrendAndReport()
{
InitializeComponent();
while (k < )
{
PrintDocument();
}
} public void PrintDocument()
{
int EveryTabeNum = ;
int TabPortaitSpan = ; XRTable xt = new XRTable();
xt.CanGrow = true;
xt.Borders = DevExpress.XtraPrinting.BorderSide.All;
xt.BorderWidth = 0.5f;
xt.BeginInit();
XRTableRow xrow_header = new XRTableRow();
XRTableCell xc_header = new XRTableCell();
xc_header.Text = "DevExpress Page Break Usage -- Table" + (k + ).ToString();
xc_header.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
xrow_header.Cells.Add(xc_header);
xt.Rows.Add(xrow_header);
for (int i = ; i < ; i++)
{
XRTableRow xrow = new XRTableRow();
xrow.CanGrow = true;
xrow.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter;
for (int j = ; j < ; j++)
{
XRTableCell xc = new XRTableCell();
xc.HeightF = 25f;
if (i % == )
{
if (i / >= )
{
xc.Text = "ABCD";
}
else
{
xc.Text = DateTime.Now.ToShortDateString();
}
}
else
{
xc.CanGrow = true;
xc.Text = DateTime.Now.ToLocalTime().ToShortTimeString();
}
xrow.Cells.Add(xc);
}
if (i % == )
{
xrow.BackColor = Color.LightGray;
}
xt.Rows.Add(xrow);
}
xt.AdjustSize();
xt.EndInit();
xt.Font = new System.Drawing.Font(Font.FontFamily, 8f, FontStyle.Regular);
//Setting the table position.
xt.LocationF = new PointF(, TabPortaitSpan * k + xt.HeightF * k);
Detail.Controls.Add(xt);
xt.WidthF = this.PageWidth - this.Margins.Left - this.Margins.Right-; //Add page break for every EveryTabeNum tables.
if ((k + ) % EveryTabeNum == )
{
XRPageBreak pb = new XRPageBreak();
pb.LocationF = new PointF(, TabPortaitSpan * k + xt.HeightF * (k + ));
Detail.Controls.Add(pb);
}
k++;
}
}
}

4. 动态改变xrTable的元素大小

xrTable元素的大小不是我们想的只要设置宽度和高度后会自动生效,它需要在xrTable.BeginInit()TableContainer.AdjustSize();TableContainer.EndInit();的包裹之内执行,同时设置元素的属性CanGrow/CanShrink为True:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using DevExpress.XtraReports.UI;
using System.Drawing.Printing;
using System.Linq.Expressions; namespace DevExpressConsole
{
public partial class TrendAndReport : DevExpress.XtraReports.UI.XtraReport
{
int k = ;
public TrendAndReport()
{
InitializeComponent();
PrintDocument();
} public void PrintDocument()
{
int TabPortaitSpan = ; XRTable xt = new XRTable();
xt.CanGrow = true;
xt.Borders = DevExpress.XtraPrinting.BorderSide.All;
xt.BorderWidth = 0.5f;
xt.BeginInit(); for (int i = ; i < ; i++)
{
XRTableRow xrow = new XRTableRow();
xrow.CanGrow = true;
xrow.HeightF = 50f;
xrow.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; for (int j = ; j < ; j++)
{
XRTableCell xc = new XRTableCell();
if (i % == )
{
if (i / >= )
{
xc.Text = "ABCD";
}
else
{
xc.Text = DateTime.Now.ToShortDateString();
}
}
else
{
xc.Text = DateTime.Now.ToLocalTime().ToShortTimeString();
}
xrow.Cells.Add(xc);
}
if (i % == )
{
xrow.BackColor = Color.LightGray;
}
xt.Rows.Add(xrow);
}
xt.AdjustSize();
xt.EndInit();
xt.Font = new System.Drawing.Font(Font.FontFamily, 8f, FontStyle.Regular);
xt.LocationF = new PointF(, TabPortaitSpan * k + xt.HeightF * k);
Detail.Controls.Add(xt);
xt.WidthF = this.PageWidth - this.Margins.Left - this.Margins.Right-;
}
}
}

以下为设置前后的对比图:

设置前:

设置后:

5. 在XRTableCell.AdjustSize();XRTableCell.EndInit();前后设置XRTableCell宽度Width的区别

    在XRTableCell.AdjustSize();XRTableCell.EndInit();执行前设置XRTable的宽度,则XRTableCell的宽度会以当前设置的值为准,不会再发生变化,如下图所示:

在XRTableCell.AdjustSize();XRTableCell.EndInit();执行后设置XRTable的宽度,则XRTableCell的宽度会以当前XRTable的宽度为基准根据内容自动调整宽度,如下所示:

6. 需要注意的几点

 A. XRTable背景色可以通过整行去添加背景色,而不需要一个一个XRTableCell去设置:

 XRTableRow xrTableRow = new XRTableRow();

 xrTableRow.BackColor = Color.LightGray;

B. 设置XRTable的边框及颜色会覆盖xrTableRow和xrTableCell之前的设置,所以在设置时要从外到里进行设置。

7. 总结:

以上就是这次用递归动态生成XRTable时所领会到的经验和教训,特此总结,以便备用!

Dev Express 动态生成XRTable使用总结的更多相关文章

  1. Dev Express Report 学习总结(四)Dev Express 动态生成XRTable使用总结

    1. XRTableCell常见属性  XRTableCell xrTableCell = new XRTableCell(); A. 字体及字体大小 xrTableCell.Font = new S ...

  2. 【.NET深呼吸】Zip文件操作(2):动态生成Zip文档

    通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成zip文件. 文件流操作 ...

  3. 关于动态生成data组件

    /*! * WeX5 v3 (http://www.justep.com) * Copyright 2015 Justep, Inc. * Licensed under Apache License, ...

  4. DevExpress 中根据数据库字典动态生成卡式菜单 z

    第三方的Devexpress套件因为要使用权限机制控制不同用户进入系统显示菜单所以要配合字典数据动态生成.在WEB中这种问题灰常的轻松在winform里就稍微有点不同为了用DEV实现卡式菜单有组的概念 ...

  5. 动态生成Zip

    动态生成Zip文档   通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成 ...

  6. Dev Express Report 学习总结(一) 基础知识总结

    Dev Express,一个非常优秀的报表控件.像其他报表一样,该报表也包括几个主要部分:Report Header,Page Header,Group Header,Detail,Group Foo ...

  7. DEV Express

    记录在使用DEV Express中遇到的所有问题及解决方案 问题1:将Dev11升级到Dev14 解决方案:将解决方案中原有Dev引用删除,重新添加必须的Dev14引用,问题解决: 问题2:LC.ex ...

  8. Aop动态生成代理类时支持带参数构造函数

    一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...

  9. dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来

    dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...

随机推荐

  1. java基础复习:final,static,以及String类

    2.final 1)为啥String是final修饰的呢? 自己答: 答案: 主要是为了“效率” 和 “安全性” 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所 ...

  2. 1002 Phone Numbers 解题报告

    1002. Phone Numbers Time limit: 2.0 secondMemory limit: 64 MB In the present world you frequently me ...

  3. ImageView cannot be resolved to a type

    问题: ImageView cannot be resolved to a type 报这样的错误是没有加载MainActivity.java文件中加入 import android.widget.I ...

  4. redhat6.3下源码编译方式安装最新版git

    在linux下安装git,通过yum方式安装的不是最新版本. 要替换最新版需要以下操作. 1.安装依赖包 # yum install curl-devel expat-devel gettext-de ...

  5. Hadoop集群datanode磁盘不均衡的解决方案

    一.引言: Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加新的数据节点,节点与节点之间磁盘大小不一样等等.当hdfs出现不平衡状况的时候,将引发很多问题,比 ...

  6. Oracle学习笔记(1)----忘记用户名的密码该如何找回

    (1)在连接数据库之前需要打开如下服务: (2)如果忘记用户的密码 I:打开cmd窗口 II:键入命令:connect / as sysdba; III:alter user 用户名 identifi ...

  7. MVC2,MVC3,MVC4和MVC5的不同

    现在MVC的技术日趋成熟,面对着不同版本的MVC大家不免有所迷惑 -- 它们之间有什么不同呢?下面我把我搜集的信息汇总一下,以便大家能更好的认识不同版本MVC的功能,也便于自己查阅. View Eng ...

  8. JavaScript打印正倒直线

    做了一个作业,用JavaScript打印正倒直线,突然觉得自己还是逻辑有待加强训练啊 document.write("<h3>打印倒正金字塔直线</h3>" ...

  9. cmp函数

    cmp(x,y),既可以比较数字大小,也可以比较字符串.如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1. 数字的比较 >>> ...

  10. python 中的decorator

    python 中decorator的作用就是一个包装的作用,所谓包装指在执行真正的函数之前或者之后,我们可以有一些额外的发挥余地. decorator形式如下 def dec(arg1): print ...