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 动态生成XRTable使用总结的更多相关文章
- Dev Express Report 学习总结(四)Dev Express 动态生成XRTable使用总结
1. XRTableCell常见属性 XRTableCell xrTableCell = new XRTableCell(); A. 字体及字体大小 xrTableCell.Font = new S ...
- 【.NET深呼吸】Zip文件操作(2):动态生成Zip文档
通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成zip文件. 文件流操作 ...
- 关于动态生成data组件
/*! * WeX5 v3 (http://www.justep.com) * Copyright 2015 Justep, Inc. * Licensed under Apache License, ...
- DevExpress 中根据数据库字典动态生成卡式菜单 z
第三方的Devexpress套件因为要使用权限机制控制不同用户进入系统显示菜单所以要配合字典数据动态生成.在WEB中这种问题灰常的轻松在winform里就稍微有点不同为了用DEV实现卡式菜单有组的概念 ...
- 动态生成Zip
动态生成Zip文档 通过前面一篇烂文的介绍,大伙儿知道,ZipArchive类表示一个zip文档实例,除了用上一篇文章中所列的方法来读写zip文件外,还可以直接通过ZipArchive类,动态生成 ...
- Dev Express Report 学习总结(一) 基础知识总结
Dev Express,一个非常优秀的报表控件.像其他报表一样,该报表也包括几个主要部分:Report Header,Page Header,Group Header,Detail,Group Foo ...
- DEV Express
记录在使用DEV Express中遇到的所有问题及解决方案 问题1:将Dev11升级到Dev14 解决方案:将解决方案中原有Dev引用删除,重新添加必须的Dev14引用,问题解决: 问题2:LC.ex ...
- Aop动态生成代理类时支持带参数构造函数
一.背景 在某些情况下,我们需要植入AOP代码的类并没有默认构造函数.那么此时动态生成的代理类也需要相同签名的构造函数,并且内部调用原始类的构造函数.自己折腾了1晚上没搞定,现在搞定了发出来供大家一起 ...
- dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来
dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...
随机推荐
- matlab画带标记的折线图
1.不带标记的 如: x=[1,5,3,7,4] plot(x) 2. 带标记 plot(x,'-*') '-s' 表示方格 '-p' 表示五角星 '-d' 表示菱形 '-h' 表示六角形 '-+' ...
- 像Maven一样构建java项目的目录,更好的管理java工程的源码
都知道maven具有管理Java或者Javaweb的功能.我个人尤其看中的是其代码层次的分离.不同的代码在不同的文件夹下.这是在eclipse新建一个普通的工程无法实现的.而如果用maven实现有时候 ...
- C++文件流类与文件流对象
文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件 ...
- EditPlus 3.7.164 中文版(4月3日更新)
新的版本汉化了之前无法汉化的部分内容,并修复了旧汉化版的部分问题. 欢迎下载新的翻译文件.
- C#中try catch中throw ex和throw方式抛出异常有何不同
我们在C#的try catch代码块中里面经常使用throw语句抛出捕捉到的异常,但是你知道吗使用throw ex和throw抛出捕获到的异常效果是不一样的. 异常捕捉的原理 首先先介绍一下C#异常捕 ...
- 关于JSON
JSON:一种数据交换格式,不是一种编程语言.(JSON 语法是 JavaScript 对象表示法语法的子集.) 什么是 JSON ? JSON 指的是 JavaScript 对象表示法(JavaSc ...
- SQL2008完全卸载详解(图解)
一. SQL2008卸载. 1.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板”
- catalina
用catalina启动tomcat容器,将项目放到tomcat中,通过cmd:启动:catalina,相当于本地的测试环境.
- asp.net调用客户端WebBrowser 进行网站地址截屏
在asp.net网站中,如果要实现,在文本框中输入一个URL地址,就把该网页的页面整屏截下来,这段时间一直在研究这一块,在网上查了好多资料.自己又整合了一下. 其实也不是想象中的那么难.主要是通过调用 ...
- socket(二)
作用域 1 2 3 if 1 == 1: name = 'alex' print(name) python中是没有块儿作用域的,所以python可以输出name java/c中有块级作用域, ...