Dev Express Report 学习总结(四)Dev Express 动态生成XRTable使用总结
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 Report 学习总结(四)Dev Express 动态生成XRTable使用总结的更多相关文章
- Dev Express Report 学习总结(八)Dev Express Reports 常见问题总结
1. 在新建ASP.NET Dev Express Report时的两种方式: A. 右键Add DevExpress Item->New Item->All->从Web Repor ...
- Dev Express Report 学习总结(一) 基础知识总结
Dev Express,一个非常优秀的报表控件.像其他报表一样,该报表也包括几个主要部分:Report Header,Page Header,Group Header,Detail,Group Foo ...
- Dev Express Report 学习总结(二)关于如何使用Grouping分组
对于所有的报表工具来说,基本上所有Grouping功能的都很相似.正如前面说到的,Group处于Page Header和Page Footer之间,同时又将Detail包括与其中. 下面还是通过一个例 ...
- Dev Express Report 学习总结(七)Dev Express Reports 常见知识点总结
1. CalculatedField中常见表达式: A. For percent: [ValA]* 100 / ([ValA]+[ ValB]); PS. Please remre ...
- Dev Express Report 学习总结(六)Dev Express Reports自定义Summary
在我们使用DevExpress开发报表的过程中,对于页面中复杂的数据合计,我们可能会使用到自定义Summary.下面通过一个例子来进行说明: 首先,我建立了如上图所示的报表页面,其中的数据源来自cla ...
- Dev Express Report 学习总结(三)关于子报表Sub-Report的使用
子报表即在一个Report(主报表)中嵌入另一个Report(子报表),从理论上来讲,任何一个Report都可以作为一个子报表,但在实际使用过程中,只有主报表和子报表构成一对多关系时才会使用子报表.使 ...
- Dev Express Report 学习总结(五)在分组中使用聚集表达式AggregateExpression
聚集表达式AggregateExpression主要包括几种:Avg(),Count(),Exists(),Max(),Min(),Single()和Sum().其中对于Sum(),在我看来主要有两种 ...
- Dev Express 动态生成XRTable使用总结
1. XRTableCell常见属性 XRTableCell xrTableCell = new XRTableCell(); A. 字体及字体大小 xrTableCell.Font = new S ...
- Python 学习 第四篇:动态类型模型
Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...
随机推荐
- 《Effective Java》第3章 对于所有对象都通用的方法
第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每 ...
- java 字符流 字节流
java对文本文档进行操作(拷贝.显示)出现乱码一般来说,可以从两个方面入手. 1.文本文件本身的编码格式. 2.java代码中处理文本文件的编码格式. 这里要注意的一点是,我们可以看出copyFil ...
- msbuild 中文说明文档
Microsoft (R) 生成引擎版本 14.0.25420.1 版权所有(C) Microsoft Corporation.保留所有权利. 语法: MSBuild.exe [选项] [项目文件] ...
- vs code 提示快捷键
1.ctrl+space 基本上被输入法快捷键占用 文件->首选项->键盘快捷方式(ctrl+k,ctrl+s):搜索 editor.action.triggerSuggest 换成 ct ...
- 扒一扒spring,dom4j实现模拟实现读取xml
今天leadr提出需求,原来公司项目中读取解析xml文件的代码效率太低,考虑切换一种xml为数据封装格式与读取方式以提高效率.我这灵机一动spring对bean的依赖注入就是读取xml文件,可以尝试扒 ...
- C++时间操作的汇总
. 获取当前时间 time_t cur_time = time(NULL); . 把整数时间转为字符串时间 string GetStringTime(const time_t time) { stru ...
- CENSORING——AC 自动机
题目 [题目描述] FJ 为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西 (比如如何煮牛排). FJ 将杂志中所有的文章提取出来组成一个长度最多为 $ 10^5 $ ...
- 老男孩Day5作业:电子银行购物商城
1.作业需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录支持账户间转账 记录每月日常消 ...
- Warning: Static member accessed via instance reference
Warning: Static member accessed via instance reference Shows references to static methods and fields ...
- Set\HashSet集合为什么能去重(转)
如果想查找一个集合中是否包含有某个对象,大概的程序代码怎样写呢?当发现某个元素与要查找的对对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则返回否定的信息.如果是一个集合中 ...