在Detail的事件中:html
int i=0;
private void OnBeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
//控制每頁報表顯示的條數
if (i!=0&&i%8==0) //每頁顯示8條
{
Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.BeforeBand;
}
else
{
Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.None;
}
i++;
}
ide
在Table的事件中:post
private void OnBeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) {
//////////////////////////////////////////////////數據集「StorageBillMatItem」進行替換便可
if(i==((System.Data.DataSet)(xtraReport1.DataSource)).Tables["StorageBillMatItem"].Rows.Count)
{
XRTable table = xrTable2;//Template Detail Band XRTable
int iheight = table.Rows[table.Rows.Count - 1].Height;
int SpaceRowCount = 8-(i)%8;
XRTableRow[] xrRow = new XRTableRow[SpaceRowCount];
for(int k=0;k<SpaceRowCount ;k++)
{
xrRow[k] = new XRTableRow();
xrRow[k].Size = new Size(table.Width, iheight);
xrRow[k].Location = new Point(table.Location.X, k * iheight);
xrRow[k].Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top);
xrRow[k].BorderWidth = 1;
xrRow[k].BorderColor = table.Rows[table.Rows.Count - 1].BorderColor;
//CreateCell
XRTableRow row = table.Rows[table.Rows.Count - 1];
CreateCellArray(xrRow[k], row);
}
xrTable2.Rows.AddRange(xrRow);
}
}
/// <summary>
/// CreateCell
/// </summary>
/// <param name="xrRow">Current Row</param>
/// <param name="xrRowTemplate">Row Template</param>
private void CreateCellArray(XRTableRow xrRow, XRTableRow xrRowTemplate)
{
int Xmargin = 0;
for (int i = 0; i < xrRowTemplate.Cells.Count; i++)
{
XRTableCell xrcell = new XRTableCell();
xrcell.BorderWidth = 1;
xrcell.Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top);
xrcell.Width = xrRowTemplate.Cells[i].Width;
xrcell.BackColor = xrRowTemplate.Cells[i].BackColor;
xrcell.Height = xrRowTemplate.Height;
if (i != 0)
{
xrcell.Location = new Point(Convert.ToInt32(Xmargin + xrRowTemplate.Cells[i].Width), 0);
}
else
{
xrcell.Location = new Point(0, 0);
}
xrRow.Cells.Add(xrcell);
}
}測試
http://www.dxper.net/documents/html/DevExpressXtraReportsUIXtraReport_ScriptLanguagetopic.htmui
我以爲首先須要瞭解打印的一些常識和DevExpress.XtraReports的打印邏輯:
1.PageHeader和PageFooter高度是固定的,Detail高度是變的,因此嵌套的數據源通常放到Detail中;
2.報表的分頁按照兩個原則:首先最外層的是根據Report的數據源的RowChanged,內層是根據數據源的每一個Row的填充結果,若是數據填滿整個頁還沒打印完,就會分頁打印到下一頁;url
而後就說一下套打。套打比較麻煩的是單據內數據的定位,假若有N張報表,每張報表上又須要N個控件,經過打印測試比對修改的方式確定行不通,在XtraReports中能夠經過加背景圖片的方式定位控件,分幾個步驟:
1.將全部單據報表按1:1掃描;
2.在一張空的報表中拖入一個XRPictureBox控件,設置控件的Image屬性爲任一張報表圖片,設置Sizing屬性爲ZoomImage,並將控件佔滿整個報表;
3.打印測試比對,直到打印出的圖片和實際單據徹底一致,經過圖片的長寬屬性和XRPictureBox控件的長寬屬性計算出比值;
4.將3中計算出的比值應用到其餘報表掃描圖片上,再將圖片做爲報表背景定位各個數據控件的位置。spa
下面舉一個我作的單據中一個比較複雜一點的例子,以下圖:.net
這張單據的難點首先是存在兩個高度不肯定的部分:「託運人提供詳細狀況」和「運費與附加費」。這兩部分的數據分別存在單獨的表中,記錄數不定。對於這種狀況,爲了使總體結構清晰,我通常把不肯定的部分放到SubReport中。我嘗試放了兩個SubReport,然而XtraReports的打印邏輯是先打印完上面的SubReport而後纔打印下面的SubReport,和單據狀況不符,失敗。(不知這種狀況誰有比較好的解決方案)問題沒法解決,我又分析了一下需求,問了客戶的狀況,瞭解到"運費與附加費"記錄數不多,通常兩三條,最多也不會到引發分頁的地步,我調整了一下,把下面的SubReport改成包含6個Row的固定高度的XtrTable,並將「集裝箱數或件數合計」一下所有併入PageFooter,問題一解決。htm
不久客戶說紅框框中的部分放一個主表的字段,是一個多行文本,且print per page,因此紅框框中這部分不能放在SubReport中了,放在外面,由於在Report中SubReport沒有Left屬性(SubReport都是從Report的最左邊開始打印),SubReport也不能用了,最後只好放了一個XtrTable,只包含一個Row,而後根據記錄數在BeforePrint事件中動態添加Row。到這裏整張單據基本完成了。blog
![]() 代碼: int i=0; private void OnBeforePrint1(object sender, System.Drawing.Printing.PrintEventArgs e) { //控制每頁報表顯示的條數 if (i!=0&&i%19==0) //每頁顯示19條 { Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.BeforeBand; } else { Detail.PageBreak = DevExpress.XtraReports.UI.PageBreak.None; } i++; } private void OnBeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e) { Purchaseordersheet obj = (Purchaseordersheet)Report1.GetCurrentRow(); //定義採購申請 // Purchaserequisition ent; // 獲取當前採購申請的行數 // ent=(Purchaserequisition)Detail Report.GetCurrentRow(); obj .Purchaserequisitions.Count //判斷變量是否等於採購申請的行數 if(i==obj.Purchaserequisitions.Count&& i<19) { XRTable table = table1;//Template Detail Band XRTable //int iheight = table.Rows[table.Rows.Count-1].Height; int iheight = table.Rows[0].Height; int SpaceRowCount = 19-(i)%19; XRTableRow[] xrRow = new XRTableRow[SpaceRowCount]; for(int k=0;k<SpaceRowCount ;k++) { xrRow[k] = new XRTableRow(); xrRow[k].Size = new Size(table.Width, iheight); xrRow[k].Location = new Point(table.Location.X, k * iheight); xrRow[k].Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top); xrRow[k].BorderWidth = 1; xrRow[k].BorderColor = table.Rows[table.Rows.Count - 1].BorderColor; //CreateCell XRTableRow row = table.Rows[table.Rows.Count - 1]; CreateCellArray(xrRow[k], row); } table.Rows.AddRange(xrRow); } } /// <summary> /// CreateCell /// </summary> /// <param name="xrRow">Current Row</param> /// <param name="xrRowTemplate">Row Template</param> private void CreateCellArray(XRTableRow xrRow, XRTableRow xrRowTemplate) { int Xmargin = 0; for (int i = 0; i < xrRowTemplate.Cells.Count; i++) { XRTableCell xrcell = new XRTableCell(); xrcell.BorderWidth = 1; xrcell.Borders = (DevExpress.XtraPrinting.BorderSide)((BorderSide.Left | BorderSide.Right) | BorderSide.Top); xrcell.Width = xrRowTemplate.Cells.Width; xrcell.BackColor = xrRowTemplate.Cells.BackColor; //xrcell.Height =xrRowTemplate.Height; //xrcell.BackColor = Color.Red; xrcell.Text = " "; xrcell.Font = new System.Drawing.Font("宋體", 9.75F); if (i != 0) { xrcell.Location = new Point(Convert.ToInt32(Xmargin + xrRowTemplate.Cells.Width), 0); } else { xrcell.Location = new Point(0, 0); } xrRow.Cells.Add(xrcell); } } 這是一個報表下明細的條目,爲何補出來的空格與我設置的不同 |
目測了一下樓主的報表,我以爲可能存在兩個問題: 1.報表中若是要設置空行,根本不用指定每頁有多少行,這是笨辦法。正確的作法是添加區段(好比頁腳,這樣會產生每頁固定高度的頁腳),用區段來控制每頁報表的行數、位置。 宜採用 FillEmptySpace 事件來處理 2.報表的單元格線條問題,看上去像是重合的,是由於你將報表格都設定四周都有,這種方法也是不正確的,建議多看一下自帶的示例 另外,你能夠參考一下我發的示例 http://smartsoft.5d6d.net/thread-15200-1-1.html這個是沒有指定每頁有多少行的,同樣達到了目的,而且更加靈活。你只要把分組 GroupFooter 拉長一點,就達到你想要的目的了 |