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 = 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();
            }
        }
    }
}
View Code

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++;
        }
    }
}
View Code

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;
        }
    }
}
View Code

以下為設置前后的對比圖:

設置前:

設置后:

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時所領會到的經驗和教訓,特此總結,以便備用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM