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 = 30; float CondtWidth = 30; for (int i = 0; i <= 7; i++) { XRTable TableContainer = new XRTable(); TableContainer.CanGrow = true; TableContainer.BeginInit(); for(int j=0;j<8;j++) { XRTableRow TCRow = new XRTableRow(); TCRow.CanGrow = true; XRTableCell OrderNo = new XRTableCell(); OrderNo.CanGrow = true; OrderNo.WidthF = TotalWidth - CondtWidth - 400; OrderNo.HeightF = CellHeight; OrderNo.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; OrderNo.ProcessDuplicates = DevExpress.XtraReports.UI.ValueSuppressType.Suppress; OrderNo.Text = j + 1 + ""; OrderNo.WordWrap = true; TCRow.Cells.Add(OrderNo); XRTableCell Happy = new XRTableCell(); Happy.CanGrow = true; Happy.WidthF = 400; 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 = 200; 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(0, 25 + 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 = 270; 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 = 0; public TrendAndReport() { InitializeComponent(); while (k < 5) { PrintDocument(); } } public void PrintDocument() { int EveryTabeNum = 1; int TabPortaitSpan = 25; 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 + 1).ToString(); xc_header.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; xrow_header.Cells.Add(xc_header); xt.Rows.Add(xrow_header); for (int i = 0; i < 6; i++) { XRTableRow xrow = new XRTableRow(); xrow.CanGrow = true; xrow.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; for (int j = 0; j < 3; j++) { XRTableCell xc = new XRTableCell(); xc.HeightF = 25f; if (i % 2 == 0) { if (i / 10 >= 1) { 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 % 2 == 0) { 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(0, TabPortaitSpan * k + xt.HeightF * k); Detail.Controls.Add(xt); xt.WidthF = this.PageWidth - this.Margins.Left - this.Margins.Right-50; //Add page break for every EveryTabeNum tables. if ((k + 1) % EveryTabeNum == 0) { XRPageBreak pb = new XRPageBreak(); pb.LocationF = new PointF(0, TabPortaitSpan * k + xt.HeightF * (k + 1)); 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 = 0; public TrendAndReport() { InitializeComponent(); PrintDocument(); } public void PrintDocument() { int TabPortaitSpan = 25; XRTable xt = new XRTable(); xt.CanGrow = true; xt.Borders = DevExpress.XtraPrinting.BorderSide.All; xt.BorderWidth = 0.5f; xt.BeginInit(); for (int i = 0; i < 4; i++) { XRTableRow xrow = new XRTableRow(); xrow.CanGrow = true; xrow.HeightF = 50f; xrow.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleCenter; for (int j = 0; j < 3; j++) { XRTableCell xc = new XRTableCell(); if (i % 2 == 0) { if (i / 10 >= 1) { xc.Text = "ABCD"; } else { xc.Text = DateTime.Now.ToShortDateString(); } } else { xc.Text = DateTime.Now.ToLocalTime().ToShortTimeString(); } xrow.Cells.Add(xc); } if (i % 2 == 0) { 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(0, TabPortaitSpan * k + xt.HeightF * k); Detail.Controls.Add(xt); xt.WidthF = this.PageWidth - this.Margins.Left - this.Margins.Right-50; } } }
以下為設置前后的對比圖:
設置前:
設置后:
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時所領會到的經驗和教訓,特此總結,以便備用!