Skip to main content Skip to footer

Displaying Summarized Data in C1PrintDocument

Calculating summary of records in a table is very important from the point of view of data representation. This blog is all about summarizing data in a RenderTable of C1PrintDocument. Consider an example of an Account Book where it is mandatory to show the total of entries printed on a page such that every page displays a subtotal followed by a grand total on the last page in the document. The requirement seems to be a bit tricky, however, the implementation is quite simple :) Before moving further to the approach for the solution, lets take a look at our output. The implementation includes adding a Dictionary which calculates the progressive total in the PageAdded event of C1PrintDocument and displaying the resultant value in the last row of the page. Here is the code snippet for accomplishing the same:

.NET PrintDocument Calculated Totals

private void Generate()  
{  
   RenderTable rt = new RenderTable();  
   rt.Style.FontSize = 14;  
   rt.CellStyle.Spacing.All = new Unit(2, C1.C1Preview.UnitTypeEnum.Mm);  
   rt.Style.GridLines.All = new C1.C1Preview.LineDef(new Unit(0.3, UnitTypeEnum.Mm), Color.Black, DashStyle.Solid);  
   rt.Cols[0].Width = new Unit(2, C1.C1Preview.UnitTypeEnum.Cm);  
   rt.Cols[1].Width = new Unit(5, C1.C1Preview.UnitTypeEnum.Cm);  
   rt.Cols[2].Width = new Unit(2, C1.C1Preview.UnitTypeEnum.Cm);  
   rt.Cols[3].Width = new Unit(2, C1.C1Preview.UnitTypeEnum.Cm);  
   rt.Cols[4].Width = new Unit(3, C1.C1Preview.UnitTypeEnum.Cm);  
   // Header  
   int row = rt.Rows.Count;  
   rt.Cells[row, 0].Text = "No.";  
   rt.Cells[row, 1].Text = "Description";  
   rt.Cells[row, 2].Text = "Count";  
   rt.Cells[row, 3].Text = "Price";  
   rt.Cells[row, 4].Text = "Sum";  
   rt.Rows[row].Style.FontBold = true;  
   rt.Rows[row].Style.BackColor = Color.LightGray;  
   rt.RowGroups[row, 1].PageHeader = true;  
   // Rows  
   int total = 0;  
   for (int n = 1; n < 64; n++)  
   {  
     row = rt.Rows.Count;  
     rt.Cells[row, 0].Text = string.Format("{0}", n);  
     rt.Cells[row, 1].Text = string.Format("Name {0}", n);  
     rt.Cells[row, 2].Text = string.Format("{0}", n * 2);  
     rt.Cells[row, 3].Text = string.Format("{0}", 1000);  
     CellData cellData;  
     cellData.value = 1000 * n * 2;  
     rt.Cells[row, 4].Text = string.Format("{0}", cellData.value);  
     rt.Cells[row, 4].Tag = cellData;  
     total += 1000 * n * 2;  
    }  
    // Page footer  
    row = rt.Rows.Count;  
    rt.Rows[row].Style.BackColor = Color.LightGray;  
    rt.Cells[row, 1].Text = "PAGE TOTAL";  
    rt.Cells[row, 4].Text = "[((Dictionary<int, int>)Page.Document.UserData)[Page.Index]]";  
    rt.Cells[row, 4].Style.TextColor = Color.Red;  
    rt.RowGroups[row, 1].PageFooter = true;  
    // Report footer  
    row = rt.Rows.Count;  
    rt.Rows[row].Style.BackColor = Color.Gray;  
    rt.Cells[row, 1].Text = "GRAND TOTAL";  
    rt.Cells[row, 4].Text = string.Format("{0}", total);  
    rt.RowGroups[row, 1].Footer = TableFooterEnum.None;  
    _printDocument.UserData = new Dictionary<int, int>();  
    _printDocument.Body.Children.Clear();  
    _printDocument.PageLayout.PageSettings.Landscape = true;  
    _printDocument.PageLayout.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A4;  
    _printDocument.Body.Children.Add(rt);  
    _printDocument.Generate();  
}  
private void \_printDocument\_PageAdded(C1PrintDocument sender, PageEventArgs e)  
{  
    int summ = 0;  
    foreach (RenderFragment fragment in e.Page.Fragments)  
    {  
      foreach (object child in fragment.Children)  
      {  
        if (child.GetType() == typeof(RenderTextFragment))  
         {  
           RenderText text = ((RenderTextFragment)child).RenderObject;  
           if (text.TableCell.Tag != null && text.TableCell.Tag.GetType() == typeof(CellData))  
           {  
             summ += ((CellData)text.TableCell.Tag).value;  
           }  
          }  
        }  
     }  
     ((Dictionary<int, int>)e.Page.Document.UserData).Add(e.Page.Index, summ);  
}