c# pdf viewer itextsharp : Reorder pages pdf file application Library utility azure .net web page visual studio winforms.reportdesigner12-part1622

115 
sDefault.FontSize = 10 
' Add and set up keyword style: 
Dim sKeyword As Style = doc.Style.Children.Add() 
sKeyword.FontName = "Courier New" 
sKeyword.FontSize = 10 
sKeyword.TextColor = Color.Blue 
' Add and set up comments style: 
Dim sComment As Style = doc.Style.Children.Add() 
sComment.FontName = "Courier New" 
sComment.FontSize = 10 
sComment.FontItalic = True 
sComment.TextColor = Color.Green 
C# 
C1PrintDocument doc = new C1PrintDocument(); 
// Add and set up default code style: 
Style sDefault = doc.Style.Children.Add(); 
sDefault.FontName = "Courier New"; 
sDefault.FontSize = 10; 
// Add and set up keyword style: 
Style sKeyword = doc.Style.Children.Add(); 
sKeyword.FontName = "Courier New"; 
sKeyword.FontSize = 10; 
sKeyword.TextColor = Color.Blue; 
// Add and set up comments style: 
Style sComment = doc.Style.Children.Add(); 
sComment.FontName = "Courier New"; 
sComment.FontSize = 10; 
sComment.FontItalic = true; 
sComment.TextColor = Color.Green; 
3.
In your code, whenever you create a C1PrintDocument element representing a part of source code you're 
pretty printing, assign the corresponding style to the element style's Parent, for example: 
Visual Basic 
Dim codeLine As New RenderParagraph() 
MessageBox.Show("Hello World!") 
' say hi to the world 
Dim p1 As New ParagraphText("MessageBox") 
p1.Style.AmbientParent = sKeyword 
codeLine.Content.Add(p1) 
Dim p2 As New ParagraphText(".Show(""Hello World!""); ") 
p2.Style.AmbientParent = sDefault 
codeLine.Content.Add(p2) 
Dim p3 As New ParagraphText("// say hi to the world") 
p3.Style.AmbientParent = sComment 
codeLine.Content.Add(p3) 
doc.Body.Children.Add(codeLine) 
C# 
RenderParagraph codeLine = new RenderParagraph(); 
MessageBox.Show("Hello World!"); // say hi to the world 
ParagraphText p1 = new ParagraphText("MessageBox"); 
p1.Style.AmbientParent = sKeyword; 
codeLine.Content.Add(p1); 
ParagraphText p2 = new ParagraphText(".Show(\"Hello World!\"); "); 
p2.Style.AmbientParent = sDefault; 
codeLine.Content.Add(p2); 
Reorder pages pdf file - re-order PDF pages in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Support Customizing Page Order of PDF Document in C# Project
how to move pages within a pdf; how to move pages in pdf files
Reorder pages pdf file - VB.NET PDF Page Move Library: re-order PDF pages in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sort PDF Document Pages Using VB.NET Demo Code
change page order pdf reader; how to reorder pdf pages in reader
116  
ParagraphText p3 = new ParagraphText("// say hi to the world"); 
p3.Style.AmbientParent = sComment; 
codeLine.Content.Add(p3); 
doc.Body.Children.Add(codeLine); 
That's it, you're done. If you consistently assign your predefined styles to AmbientParent (or Parent, see below) 
properties of various document elements, your code will be more memory efficient (and more easily manageable). 
You may have noted that you assigned your predefined styles to the AmbientParent property of the elements' 
styles. Remember, in C1PrintDocument styles, ambient properties affect content of elements, and by default 
propagate via elements' hierarchies – so nested objects inherit ambient style properties from their parents (unless a 
style's AmbientParent property is explicitly set). In contrast to that, non-ambient properties affect elements' 
"decorations" and propagate via styles' own hierarchy determined by styles' parents – so for a non-ambient style 
property to affect a child object, its style's Parent property must be set.  
The usefulness of this distinction is best demonstrated by an example: suppose you have a RenderArea containing 
a number of RenderText objects. To draw a border around the whole render area you would set the area's 
Style.Borders. Because Borders is a non-ambient property, it will draw the border around the area but will not 
propagate to the nested text objects and will not draw borders around each text – which is normally what you'd 
want. On the other hand, to set the font used to draw all texts within the area, you again would set the area's 
Style.Font. Because Font, unlike Borders, is an ambient property it will propagate to all nested text objects and 
affect them – again usually achieving the desired result. So when you are not setting styles' parent/ambient parent 
properties – things normally "just work". But when you do use styles' parents – you must take the distinction 
between ambient and non-ambient style properties into consideration. 
Note that for cases when you want to affect both ambient and non-ambient properties of an object, you may use 
the Style.Parents (note the plural) property – it sets both Parent and AmbientParent properties on a style to the 
specified value. 
Tip 3: Using Expressions to Customize Page Headers 
Sometimes it is necessary to use a different page header for the first or last page of a document. While 
C1PrintDocument provides a special feature for that (see the PageLayouts – note the plural – property), for cases 
when the difference between the header on the first and subsequent pages is only in the header text, using an 
expression may be the best approach. For instance if you want to print "First page" as the first page's header and 
"Page x of y" for other pages, the following code may be used: 
Visual Basic 
Dim doc As New C1PrintDocument() 
doc.PageLayout.PageHeader = New RenderText("[iif(PageNo=1, ""First page"", 
""Page "" & PageNo & "" of "" & PageCount)]") 
C# 
C1PrintDocument doc = new C1PrintDocument(); 
doc.PageLayout.PageHeader = new RenderText( 
"[iif(PageNo=1, \"First page\", \"Page \" & PageNo & \" of \" & 
PageCount)]"); 
In the string representing the expression in the code above, the whole expression is enclosed in square brackets – 
they indicate to the document rendering engine that what is inside should be treated as an expression (those are 
adjustable via TagOpenParen and TagCloseParen properties on the document). 
Whatever is inside those brackets should represent a valid expression in the current C1PrintDocument's 
script/expression language. By default it is VB.NET (but can be changed to C# – see below), hence you use a 
VB.NET iif function to adjust your page header text depending on the page number. Here's the expression that is 
actually seen/executed by the document engine: 
iif(PageNo=1, "First page", "Page " & PageNo & " of " & PageCount) 
Because you must specify this expression as a C# or VB.NET string when assigning it to the page header text, you 
have to escape double quotes. Variables PageNo and PageCount are provided by the document engine (for a 
C# TIFF: How to Reorder, Rearrange & Sort TIFF Pages Using C# Code
C# TIFF - Sort TIFF File Pages Order in C#.NET. Reorder, Rearrange and Sort TIFF Document Pages in C#.NET Application. C# TIFF Page Sorting Overview.
reordering pages in pdf; change page order in pdf file
C# PDF Page Rotate Library: rotate PDF page permanently in C#.net
C# .NET, add new PDF page, delete certain PDF page, reorder existing PDF pages and split may choose to only rotate a single page of PDF file or all
how to move pages in a pdf file; how to reorder pdf pages in
117 
complete list of special variables accessible in different contexts in expressions, see the Expressions, Scripts, Tags 
topic). 
As was mentioned, the default expression/script language used by C1PrintDocument is VB.NET. But C# can also 
be used as the expression language. For that, the C1PrintDocument's Language property must be set to 
C1.C1Preview.Scripting.ScriptLanguageEnum.CSharp. Using C# as the expression language, our example 
would look like this: 
Visual Basic 
Dim doc As New C1PrintDocument() 
doc.ScriptingOptions.Language = 
C1.C1Preview.Scripting.ScriptLanguageEnum.CSharp 
doc.PageLayout.PageHeader = New RenderText("[PageNo==1 ? ""First page"" : 
""Page "" + PageNo + "" of "" + PageCount]") 
C# 
C1PrintDocument doc = new C1PrintDocument(); 
doc.ScriptingOptions.Language = 
C1.C1Preview.Scripting.ScriptLanguageEnum.CSharp; 
doc.PageLayout.PageHeader = new RenderText( 
"[PageNo==1 ? \"First page\" : \"Page \" + PageNo + \" of \" + 
PageCount]"); 
There were two changes: 
Instead of VB.NET iif function, the C# conditional operator (:?) was used. 
Instead of VB.NET's string concatenation operator (&), C#'s (+) was used. 
Note that expressions are real .NET language expressions, and all normally accessible features of the 
corresponding language may be used in expressions. For instance instead of string concatenation you could have 
used the string.Format method as follows: 
Visual Basic 
doc.PageLayout.PageHeader = New RenderText("[iif(PageNo=1, ""First page"", 
" & "string.Format(""Page {0} of {1}"", PageNo, PageCount))]") 
C# 
doc.PageLayout.PageHeader = new RenderText("[iif(PageNo=1, \"First page\", 
" + "string.Format(\"Page {0} of {1}\", PageNo, PageCount))]"); 
Tip 4: Data Binding and Expressions 
Databound render objects together with expressions are among the less known but extremely powerful 
C1PrintDocument features. In this example, you'll build a document with a render table data bound to a list of 
objects in memory. The list elements will represent Customer records with just two (for brevity) fields – Name and 
Balance: 
Visual Basic 
Public Class Customer 
Private _name As String 
Private _balance As Integer 
Public Sub New(ByVal name As String, ByVal balance As Integer) 
_name = name 
_balance = balance 
End Sub 
Public ReadOnly Property Name() As String 
Get 
Return _name 
End Get 
End Property 
Public ReadOnly Property Balance() As Integer 
VB.NET PowerPoint: Sort and Reorder PowerPoint Slides by Using VB.
Sort and Reorder PowerPoint Slides Range with VB amount of robust PPT slides/pages editing methods powerful & profession imaging controls, PDF document, image
move pdf pages in preview; how to rearrange pdf pages in preview
VB.NET TIFF: Modify TIFF File by Adding, Deleting & Sort TIFF
Users can use it to reorder TIFF pages in ''' &ltsummary> ''' Sort TIFF document pages in designed powerful & profession imaging controls, PDF document, image
how to move pages around in pdf; reorder pdf pages in preview
118  
Get 
Return _balance 
End Get 
End Property 
End Class 
C# 
public class Customer 
private string _name; 
private int _balance; 
public Customer(string name, int balance) 
_name = name; 
_balance = balance; 
public string Name { get { return _name; } } 
public int Balance { get { return _balance; } } 
The following code can be used to create a list of customer records and fill it with some sample data: 
Visual Basic 
' build sample list of customers 
Dim customers As New List(Of Customer)() 
Dim rnd As New Random(DateTime.Now.Second) 
For i As Integer = 0 To 599 
customers.Add(New Customer("Customer_" & (i + 1).ToString(), 
rnd.[Next](-1000, 1000))) 
Next 
C# 
// build sample list of customers 
List<Customer> customers = new List<Customer>(); 
Random rnd = new Random(DateTime.Now.Second); 
for (int i = 0; i < 600; i++) 
customers.Add(new Customer("Customer_" + (i+1).ToString(), rnd.Next(-
1000, 1000))); 
Note that the Balance field's value ranges from -1000 to 1000 – so the field allows negative values. This will be 
used to demonstrate a new C1PrintDocument feature, style expressions, below. 
The following code prints the list created above as a RenderTable in a C1PrintDocument: 
Visual Basic 
Dim doc As New C1PrintDocument() 
Dim rt As New RenderTable() 
' Define data binding on table rows:  
rt.RowGroups(0, 1).DataBinding.DataSource = customers 
' Bind column 0 to Name: 
rt.Cells(0, 0).Text = "[Fields!Name.Value]" 
' Bind column 1 to Balance: 
rt.Cells(0, 1).Text = "[Fields(""Balance"").Value]" 
' Add the table to the document: 
doc.Body.Children.Add(rt) 
C# 
C1PrintDocument doc = new C1PrintDocument(); 
RenderTable rt = new RenderTable(); 
// Define data binding on table rows:  
C# PDF: C# Code to Process PDF Document Page Using C#.NET PDF
delete or remove certain page from PDF document file. C# PDF Page Processing: Sort PDF Pages - online C#.NET tutorial page for how to reorder, sort, reorganize
pdf page order reverse; how to rearrange pdf pages
Read PDF in Web Image Viewer| Online Tutorials
for image viewing to read, edit, create or write PDF documents from file or stream in Extract images from PDF documents; Add, reorder pages in PDF
change pdf page order reader; how to reorder pdf pages
119 
rt.RowGroups[0, 1].DataBinding.DataSource = customers; 
// Bind column 0 to Name: 
rt.Cells[0, 0].Text = "[Fields!Name.Value]"; 
// Bind column 1 to Balance: 
rt.Cells[0, 1].Text = "[Fields(\"Balance\").Value]"; 
// Add the table to the document: 
doc.Body.Children.Add(rt); 
Databinding is achieved with just 3 lines of code. The first line defines a row group on the table, starting at row 0 
and including just that one row: 
Visual Basic 
' Define data binding on table rows:  
rt.RowGroups(0, 1).DataBinding.DataSource = customers) 
C# 
// Define data binding on table rows:  
rt.RowGroups[0, 1].DataBinding.DataSource = customers; 
The other two lines show two syntactically different but equivalent ways of binding a table cell to a data field: 
Visual Basic 
' Bind column 0 to Name: 
rt.Cells(0, 0).Text = "[Fields!Name.Value]" 
' Bind column 1 to Balance: 
rt.Cells(0, 1).Text = "[Fields(""Balance"").Value]" 
C# 
// Bind column 0 to Name: 
rt.Cells[0, 0].Text = "[Fields!Name.Value]"; 
// Bind column 1 to Balance: 
rt.Cells[0, 1].Text = "[Fields(\"Balance\").Value]"; 
As noted, the "Fields!Name"  notation is just syntactic sugar for referencing the element called Name in the Fields 
array, and allows to avoid the need to use escaped double quotes. 
Now, remember that the Balance field in the sample data set can be positive or negative. The following line will 
make all negative Balance values appear red colored in the document: 
Visual Basic 
rt.Cells(0, 1).Style.TextColorExpr = "iif(Fields!Balance.Value < 0, 
Color.Red, Color.Blue)" 
C# 
rt.Cells[0, 1].Style.TextColorExpr = "iif(Fields!Balance.Value < 0, 
Color.Red, Color.Blue)"; 
This demonstrates a new C1PrintDocument feature – style expressions. Starting with 2009 v3 release, all style 
properties have matching expression properties (ending in "Expr"), which allow you to define an expression that 
would be used at run time to calculate the effective corresponding style property. While this feature is independent 
of data binding, it can be especially useful in data bound documents as shown here. 
Style expressions allow the use of predefined C1PrintDocument tags related to pagination. For instance, the 
following code may be used to print a render object ro on red background if it appears on page with number greater 
than 10 and on green background otherwise: 
Visual Basic 
ro.Style.BackColorExpr = "[iif(PageNo > 10, Color.Red, Color.Green)]" 
C# 
ro.Style.BackColorExpr = "[iif(PageNo > 10, Color.Red, Color.Green)]"; 
VB.NET TIFF: VB.NET Sample Code to Process & Manage TIFF Page
certain TIFF page, and sort & reorder TIFF pages in Process TIFF Pages Independently in VB.NET Code. powerful & profession imaging controls, PDF document, image
reorder pages in a pdf; how to rearrange pages in pdf document
C# Word: How to Create Word Document Viewer in C#.NET Imaging
in C#.NET; Offer mature Word file page manipulation functions (add, delete & reorder pages) in document viewer; Rich options to add
pdf reverse page order online; how to rearrange pages in pdf using reader
120  
Finally, it should be noted that while VB.NET is the default expression language in C1PrintDocument, C# can be 
used instead if the Language property is set on the document: 
Visual Basic 
doc.ScriptingOptions.Language = 
C1.C1Preview.Scripting.ScriptLanguageEnum.CSharp 
C# 
doc.ScriptingOptions.Language = 
C1.C1Preview.Scripting.ScriptLanguageEnum.CSharp; 
With this in mind, our current sample may be rewritten as follows: 
Visual Basic 
Dim doc As New C1PrintDocument() 
doc.ScriptingOptions.Language = 
C1.C1Preview.Scripting.ScriptLanguageEnum.CSharp 
Dim rt As New RenderTable() 
' Define data binding on table rows:  
rt.RowGroups(0, 1).DataBinding.DataSource = customers 
' Bind column 0 to Name: 
rt.Cells(0, 0).Text = " [Fields[""Name""].Value]" 
' Bind column 1 to Balance: 
rt.Cells(0, 1).Text = " [Fields[""Balance""].Value]" 
rt.Cells(0, 1).Style.TextColorExpr = "(int)(Fields[""Balance""].Value) < 0 
? Color.Red : Color.Blue" 
' Add the table to the document: 
doc.Body.Children.Add(rt) 
C# 
C1PrintDocument doc = new C1PrintDocument(); 
doc.ScriptingOptions.Language = 
C1.C1Preview.Scripting.ScriptLanguageEnum.CSharp; 
RenderTable rt = new RenderTable(); 
// Define data binding on table rows:  
rt.RowGroups[0, 1].DataBinding.DataSource = customers; 
// Bind column 0 to Name: 
rt.Cells[0, 0].Text = " [Fields[\"Name\"].Value]"; 
// Bind column 1 to Balance: 
rt.Cells[0, 1].Text = " [Fields[\"Balance\"].Value]"; 
rt.Cells[0, 1].Style.TextColorExpr = 
"(int)(Fields[\"Balance\"].Value) < 0 ? Color.Red : Color.Blue"; 
// Add the table to the document: 
doc.Body.Children.Add(rt); 
Note the following as compared to code that used VB.NET as expressions/scripting language: 
The use of square brackets as C1PrintDocument's open/close tag parentheses (adjustable via 
TagOpenParen and TagCloseParen properties) does not conflict with their C# use for array indexing 
within the expressions because after seeing the first opening bracket, C1PrintDocument tries to find a 
matching closing one. 
Because a field's Value property is of type object, we need to cast it to an int for the conditional expression 
to work correctly (VB.NET does that automatically). 
The "Fields!Name" notation cannot be used as it is purely a VB.NET feature. 
Tip 5: Customizing Databound Table Columns 
In C1PrintDocument's tables, you can have data bound columns rather than rows. Consider our example from 
previous section – it only takes a few changes to make the data bound table expand horizontally rather than 
121 
vertically. Here’s the code rewritten to show customer’s name in the first row of the table, customer’s balance in 
the second row, with each column corresponding to a customer entry: 
Visual Basic 
Dim doc As New C1PrintDocument() 
Dim rt As New RenderTable() 
' Next 3 lines set table up for horizontal expansion: 
rt.Width = Unit.Auto 
rt.ColumnSizingMode = TableSizingModeEnum.Auto 
rt.SplitHorzBehavior = SplitBehaviorEnum.SplitIfNeeded 
' Define data binding on table columns:  
rt.ColGroups(0, 1).DataBinding.DataSource = customers 
' Bind column 0 to Name: 
rt.Cells(0, 0).Text = "[Fields!Name.Value]" 
' Bind column 1 to Balance: 
rt.Cells(1, 1).Text = "[Fields(""Balance"").Value]" 
' Print negative values in red, positive in blue: 
rt.Cells(0, 1).Style.TextColorExpr = "iif(Fields!Balance.Value < 0, 
Color.Red, Color.Blue)" 
' Add the table to the document: 
doc.Body.Children.Add(rt) 
C# 
C1PrintDocument doc = new C1PrintDocument(); 
RenderTable rt = new RenderTable(); 
// Next 3 lines set table up for horizontal expansion: 
rt.Width = Unit.Auto; 
rt.ColumnSizingMode = TableSizingModeEnum.Auto; 
rt.SplitHorzBehavior = SplitBehaviorEnum.SplitIfNeeded; 
// Define data binding on table columns:  
rt.ColGroups[0, 1].DataBinding.DataSource = customers; 
// Bind column 0 to Name: 
rt.Cells[0, 0].Text = "[Fields!Name.Value]"; 
// Bind column 1 to Balance: 
rt.Cells[1, 1].Text = "[Fields(\"Balance\").Value]"; 
// Print negative values in red, positive in blue: 
rt.Cells[0, 1].Style.TextColorExpr = 
"iif(Fields!Balance.Value < 0, Color.Red, Color.Blue)"; 
// Add the table to the document: 
doc.Body.Children.Add(rt); 
Note the following changes: 
The three lines of code following the comment starting with "next 3 lines" ensure that the table's width is 
based on the sum of columns' widths, that the columns’ width are based on their content, and that the 
table is allowed to split horizontally if it becomes too wide to fit on a single page. 
Aside from that, all other changes are basically the result of swapping rows and columns. 
Tip 6: Including WinForms controls in a document 
It is easy to include a snapshot of a WinForms control from your application in a document that is generated. To 
do that, use a RenderImage object and its Control property. For instance if your form contains a button button1, 
this code will include a snapshot of that button within a document: 
Visual Basic 
Dim doc As New C1PrintDocument() 
Dim ri As New RenderImage() 
ri.Control = Me.button1 
doc.Body.Children.Add(ri) 
122  
C# 
C1PrintDocument doc = new C1PrintDocument(); 
RenderImage ri = new RenderImage(); 
ri.Control = this.button1; 
doc.Body.Children.Add(ri); 
C1Report Tips 
The following tips relate to the C1Report component. 
Tip 1: Converting Microsoft Access Reports 
One of the most powerful features of the C1ReportDesigner application is the ability to import reports created 
with Microsoft Access. To import reports from an Access file, click the Application button and select Import from 
the menu. In the dialog box, select a Microsoft Access file (MDB or ADP) and reports.  
Note that you must have Access installed on the computer to convert an Access report. Once the report is imported 
into the Designer, Access is no longer required. For details and more information, see Importing Microsoft Access 
Reports
Tip 2: Styling Your Reports 
You can use the Style Gallery in the C1ReportDesigner application to style your report using one of over 30 built-
in styles. You can also create your own custom report styles. Built-in styles include standard Microsoft 
AutoFormat themes, including Vista and Office 2007 themes. You can access the Style Gallery from the 
C1ReportDesigner application by selecting the Arrange tab and clicking Styles. For details see Style Gallery. 
Tip 3: Using Script Expressions 
Expressions are widely used throughout a report definition to retrieve, calculate, display, group, sort, filter, 
parameterize, and format the contents of a report. Some expressions are created for you automatically (for 
example, when you drag a field from the Toolbox onto a section of your report, an expression that retrieves the 
value of that field is displayed in the text box). However, in most cases, you create your own expressions to 
provide more functionality to your report.  
For more information about taking advantage of script expressions, see Creating VBScript ExpressionsWorking 
with VBScript, and Expressions, Scripts, Tags
Tip 4: Creating Subreports 
A subreport is a report that is inserted in another report. Subreports are useful when you want to combine several 
reports into one. For example, you may have a main report that integrates several subreports into a single main 
report. Or you can use the main report to show detailed information and use subreports to show summary data at 
the beginning of each group. For information about subreports, see the Subreport property in the reference section, 
and for an example see Creating a Master-Detail Report Using Subreports
Tip 5: Understanding Reports and Report Definitions 
Reports are based on a report definition, an XML file that describes data and layout. Reports for WinForms 
creates the report definition for you when you add a report item to a project and define the report layout. When 
report execution is triggered (for example, you provide a button that the user clicks to view a report), the C1Report 
control retrieves data using the data bindings you have defined and merges the result set into the report layout. The 
report is presented in the native output format for the control you are using. 
You can load report definitions at design time or run time, from XML files, strings, or you can create and 
customize report definitions dynamically using code. 
Tip 6: CustomFields and Chart/Reports Version 
You can include a chart in a report by adding the C1Chart object to C1Report's custom field. This method is 
demonstrated in detail in the CustomFields sample installed with Reports for WinForms. Along with the sample, 
a pre-built CustomFields assembly – just as can be built with that sample – is shipped, together with several other 
123 
DLLs (such as the C1Chart assembly) as part of the C1ReportDesigner application installed by default in the 
C1Report/Designer folder in the Studio for WinForms installation directory.  
You may be tempted to just add a reference to that prebuilt C1.C1Report.CustomFields.2.dll (or 
C1.C1Report.CustomFields.4.dll) file to your own project when including a chart in a report in a C1Report-
based application. While this may work initially, it may cause unexpected problems later. The binary 
CustomFields assembly shipped with the C1ReportDesigner application is built with references to specific 
versions of C1Report and C1Chart located in the C1ReportDesigner application's subfolder. When you install 
Studio for WinForms you will have the same versions of the reports and chart products as the components you 
may use in your own application development. But if you later update just one assembly, for example just 
C1Chart, the prebuilt CustomFields in your application will suddenly no longer work since it will be referencing 
an outdated C1Chart assembly after upgrading the chart. 
For that reason it is much better and a best practice to add the actual CustomFields project (together with the 
source code) from the corresponding sample (available in both VB.NET and C# variants) to your own solution, 
and reference that project instead of the prebuilt binary CustomFields assembly. Then upgrading any of the 
involved ComponentOne products will not break your application. 
Tip 7: Adding a Custom Outline Entry for Each Data Record 
Outline entries are automatically generated for group headers in C1Report; the AddOutlineEntry event allows 
customizing the text of those entries. To associate a customized outline entry with each record of a report that 
otherwise is not using groups, follow the following steps:  
1.
Create a group that will always contain exactly one record. The easiest way to do that is to group records 
by a key field. 
2.
On that group, create a group header with the minimal height of 1 twip so that it won't show in the report. 
The AddOutlineEntry event will be fired for each instance of that group. 
3.
Attach a handler to the AddOutlineEntry event to customize the entry's text by modifying the Text 
property on the ReportEventArgs passed to the handler. 
This will associate a customized outline entry with each record of a report that otherwise is not using groups. 
Tip 8: Printing Two Subreports Side by Side 
While it is possible to create a report definition with two subreports arranged side by side on a page, generally 
speaking the C1Report component cannot properly render such subreports if they take up more than one page and 
page breaks are involved. Sometimes though, it is possible to render such reports correctly by importing the report 
definition into a C1PrintDocument component and rendering that instead. For example: 
Visual Basic 
Dim doc As New C1PrintDocument() 
doc.ImportC1Report("myReportFile.xml", "myReportName") 
doc.Generate() 
C# 
C1PrintDocument doc = new C1PrintDocument(); 
doc.ImportC1Report("myReportFile.xml", "myReportName"); 
doc.Generate(); 
See Generating Reports (C1Report vs. C1PrintDocument) and Deciding on Report Generation Method for details 
concerning advantages and limitations of importing reports into a C1PrintDocument instead of using C1Report 
directly. 
Tip 9: Passing Parameters from the Main Report into a Subreport 
To pass parameters from the main report to a subreport set the ExposeScriptObjects property to True in the main 
report. When you do so, all fields of the main report will become visible in the subreport.  
124  
So, for instance, if you took the CommonTasks.xml report shipped with the Reports for WinForms samples, and 
in report "14: Page Headers in Subreports", set ExposeScriptObjects to True, you can use the CategoryName 
(defined in the main report but not in the subreport) in the subreport's fields. 
Tip 10: Linking a Subreport to a Report Using Multiple Fields 
Normally when a subreport is used to print part of a report the linkage between the report and the subreport is 
maintained via the Text property of the field containing the subreport, somewhat like the following example: 
"SubReportLookupField = \" & ReportKeyField & \"" 
At run time that expression is calculated, yielding something similar to the following: 
SubReportLookupField = "1" 
The result is used as a filter for the subreport's data source (RowFilter property). 
The interesting thing here is that the initial expression may be more complex and may references to several fields. 
For instance, suppose the main report has DateTime type fields StartTime and EndTime, while the subreport has 
an OpenTime field, also of the DateTime type. Suppose the subreport must show only those records for which the 
following condition is true: 
OpenTime >= StartTime and OpenTime <= EndTime 
In that case the following string may be used as the subreport filter (all on a single line): 
"OpenTime >= #" & Format(StartTime, \"MM/dd/yyyy\") & "# and OpenTime <= #" & 
Format(EndTime, \"MM/dd/yyyy\") & "#" 
The Format function is used here to format DateTime values using InvariantCulture, as that is the format that 
should be used for the RowFilter. 
Visual Previewing Control Tips 
The following tips relate to the visual previewing controls included in ComponentOne Reports for WinForms 
(such as C1PrintPreviewControl, C1PrintPreviewDialog, C1PreviewPane, C1PreviewThumbnailView, 
C1PreviewOutlineView, and C1PreviewTextSearchPanel). 
Tip 1: Adding a Custom Toolbar Button to C1PrintPreviewControl 
You may want to customize a toolbar in the C1PrintPreviewControl control by adding a custom button. To add 
your own toolbar button to any of the built-in toolbars on the C1PrintPreviewControl, add a 
C1PrintPreviewControl to the form, and complete the following steps: 
1.
Click once on the C1PrintPreview control on the form to select it, and navigate to the Properties window. 
2.
In the Properties window, locate and expand the Toolbars top-level property by clicking on the plus sign 
(+) to the left of the item.  
You should see the list of predefined preview toolbars: File, Navigation, Page, Text, and Zoom. 
3.
Select and expand the toolbar, for instance File, that will contain the new item. The expanded list should 
show the predefined File buttons: Open, PageSetup, Print, Reflow, Save, and a ToolStrip expandable 
item. 
4.
Select and expand the ToolStrip item. The expanded list should contain a single Items collection node. 
5.
Select the Items node and click on the ellipses (…) button to the right of the item. The items collection 
editor dialog box containing the predefined items will be displayed. 
6.
Add a new button using the collection dialog box's commands, adjust its properties as needed, note the 
name of the button, and press OK to close the dialog box and save the changes. Now you should see the 
newly added button in the designer view. 
7.
Select the newly added button in the Properties window (you can do this by either clicking on the button 
in the designer view, or by selecting the button by its name from the Properties window's drop-down list). 
Documents you may be interested
Documents you may be interested