xtrareport實現指定記錄數以及填補空白行(網上整理)

在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);
    }
}


這是一個報表下明細的條目,爲何補出來的空格與我設置的不同

 
本帖最後由 badboy518 於 2013-1-26 13:06 編輯

目測了一下樓主的報表,我以爲可能存在兩個問題:

1.報表中若是要設置空行,根本不用指定每頁有多少行,這是笨辦法。正確的作法是添加區段(好比頁腳,這樣會產生每頁固定高度的頁腳),用區段來控制每頁報表的行數、位置。
  宜採用 FillEmptySpace 事件來處理
2.報表的單元格線條問題,看上去像是重合的,是由於你將報表格都設定四周都有,這種方法也是不正確的,建議多看一下自帶的示例

另外,你能夠參考一下我發的示例 http://smartsoft.5d6d.net/thread-15200-1-1.html這個是沒有指定每頁有多少行的,同樣達到了目的,而且更加靈活。你只要把分組 GroupFooter 拉長一點,就達到你想要的目的了
相關文章
相關標籤/搜索