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


在Detail的事件中:

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


在Table的事件中:

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.htm

我覺得首先需要了解打印的一些常識和DevExpress.XtraReports的打印邏輯:
      1.PageHeader和PageFooter高度是固定的,Detail高度是變的,所以嵌套的數據源一般放到Detail中;
      2.報表的分頁按照兩個原則:首先最外層的是根據Report的數據源的RowChanged,內層是根據數據源的每個Row的填充結果,如果數據填滿整個頁還沒打印完,就會分頁打印到下一頁;

然后就說一下套打。套打比較麻煩的是單據內數據的定位,假如有N張報表,每張報表上又需要N個控件,通過打印測試比對修改的方式肯定行不通,在XtraReports中可以通過加背景圖片的方式定位控件,分幾個步驟:
      1.將所有單據報表按1:1掃描;
      2.在一張空的報表中拖入一個XRPictureBox控件,設置控件的Image屬性為任一張報表圖片,設置Sizing屬性為ZoomImage,並將控件占滿整個報表;
      3.打印測試比對,直到打印出的圖片和實際單據完全一致,通過圖片的長寬屬性和XRPictureBox控件的長寬屬性計算出比值;
      4.將3中計算出的比值應用到其他報表掃描圖片上,再將圖片作為報表背景定位各個數據控件的位置。


下面舉一個我做的單據中一個比較復雜一點的例子,如下圖:

      這張單據的難點首先是存在兩個高度不確定的部分:“托運人提供詳細情況”和“運費與附加費”。這兩部分的數據分別存在單獨的表中,記錄數不定。對於這種情況,為了使整體結構清晰,我一般把不確定的部分放到SubReport中。我嘗試放了兩個SubReport,然而XtraReports的打印邏輯是先打印完上面的SubReport然后才打印下面的SubReport,和單據情況不符,失敗。(不知這種情況誰有比較好的解決方案)問題無法解決,我又分析了一下需求,問了客戶的情況,了解到"運費與附加費"記錄數很少,一般兩三條,最多也不會到引起分頁的地步,我調整了一下,把下面的SubReport改為包含6個Row的固定高度的XtrTable,並將“集裝箱數或件數合計”一下全部並入PageFooter,問題一解決。

      不久客戶說紅框框中的部分放一個主表的字段,是一個多行文本,且print per page,所以紅框框中這部分不能放在SubReport中了,放在外面,因為在Report中SubReport沒有Left屬性(SubReport都是從Report的最左邊開始打印),SubReport也不能用了,最后只好放了一個XtrTable,只包含一個Row,然后根據記錄數在BeforePrint事件中動態添加Row。到這里整張單據基本完成了。

 
 
 
代碼:
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 拉長一點,就達到你想要的目的了


免責聲明!

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



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