Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

C#

C1PrintDocument doc = new C1PrintDocument();
doc.Body.Children.Add(new RenderText("2 + 2 = [2+2]"));


Wiki Markup
此代码将在生成的文档中产生以下文字:
2 + 2 = 4
这种情况下, "\[2+2\]" 被解释为一个表达式,并计算出最终的文本。


注意:注意:如果表达式解析器无法解析包含在方括号内的文本,比方说文本无法被理解为一个表达式,则将文本原样

...


...

插入文档。
<span style="color:

...

#3f529c">标签</span>

...

Wiki Markup
标签与表达密切相关。事实上,标签是变量,可在表达式中使用,或者简单地作为表达式。标签允许您在希望向某个目标位置插入某个特定的字符串,但尚未确定该字符串的值的情况下,使用一个占位符。一个标签的典型例子是页码,您
需要打印页码,但是目前还无法确认页码到底显示什么,或者在文档重新生成时,页码还可能发生变化。
 \\
标签有两个主要的属性:Name 以及 Value。Name属性来识别标签,而Value属性则是表示标签将被替换为的值。
C1PrintDocument 提供两种标签:预定义标签和自定义标签。预定义的标签包括:
 \[PageNo\] -将使用当前的页码替代。
 \[PageCount\] -将使用总页数替代。
 \[PageX\] -使用当前水平方向上的页码替代。
 \[PageXCount\] -使用当水平方向上的总页数替代。
 \[PageY\] -使用当前垂直方向的页码替代(如果不存在水平方向上的分页,则这和 \[PageNo\]结果相等)。
 \[PageYCount\] -使用当前垂直方向上的总页数替代(如果不存在水平方向上的分页,则这和 \[PageCount\]结果相等)。
自定义标签存储在文档的Tags集合中。为了向该集合添加一个标签,您可以使用下面的代码:
*Visual Basic*


Visual Basic

doc.Tags.Add(New C1.C1Preview.Tag("tag1", "tag value"))

...

C#

doc.TagOpenParen = "@@@["; doc.TagCloseParen = "@@@]";


Wiki Markup
将确保只有被"@@@\[" 和"@@@\]"包含的字符串被会被解释为表达式。
表达式的括号也可以通过在之前添加转义字符进行转义,例如以下代码:
*Visual Basic*


Visual Basic

Dim doc As New C1PrintDocument()
doc.Body.Children.Add(new RenderText("2 + 2 = \\[2+2
]"))

...

C#

C1PrintDocument doc = new C1PrintDocument();
doc.Body.Children.Add(new RenderText("2 + 2 = \\[2+2
]"));


Wiki Markup
将在生成的文档中产生以下文本:
2 + 2 = \[2+2\]
因为括号已被转义。
文档的TagEscapeString可以被用作将转义字符指定为任意字符串。
<span style="color: #3f529c">在运行时编辑标签值</span>
您可以给最终用户显示一个窗体,允许查看并编辑位于C1PrintDocument组件的Tags集合中的标签的标签值。有几个新成员支持该选项,允许您创建一个自定义的窗体,用来显示特定的标签。
对于您创建的标签窗体,您可以设置几个选项。你可以: 
  每次C1PrintDocument生成之后,允许用户编辑每一个标签。更多信息,请参见显示所有标签。  让用户能够编辑一部分标签,而不是全部。可以在不希望用户编辑的标签上,设置其Flags属性的值为None。  最后您可以选择最终用户何时能够看到这个标签对话框。设置文档上的ShowTagsInputDialog属性为False,并在您希望用户看到这个标签值输入对话框的时机调用EditTags()方法。
 \\
<span style="color: #3f529c">显示所有标签</span>

...

默认情况下,ShowTagsInputDialog属性设置为false,标签对话框不显示。为了让用户在每一次C1PrintDocument文档生成时输入全部的标签,可以设置文档上的ShowTagsInputDialog属性为True。您所添加到文档的Tags集合的任何标签都将被自动展示在一个对话框里,每次即将生成文本时将显示给用户进行编辑。这使得最终用户有机会在Tags对话框编辑每一个标签值。

...


例如,下面的代码在

...

Form_Load事件向文档增加了三个标签,并向这些标签指定了文本值:

...


Visual

...

Basic

...


Visual Basic

Dim doc As New C1PrintDocument()
Me.C1PrintPreviewControl1.Document = doc
' 在文档生成时显示Tags对话框.
doc.ShowTagsInputDialog = True
' 创建将在Tags对话框中显示的标签
doc.Tags.Add(New C1.C1Preview.Tag("Statement", "Hello World!")) doc.Tags.Add(New C1.C1Preview.Tag("Name", "ComponentOne"))
doc.Tags.Add(New C1.C1Preview.Tag("Location", "Pittsburgh, PA"))
' 向文档添加标签并生成文档.
Dim rt As New C1.C1Preview.RenderText() rt.Text = "[Statement] My name is [Name] and my current location is [Location]." doc.Body.Children.Add(rt) doc.Generate()

...

C#

C1PrintDocument doc = new C1PrintDocument();
this.c1PrintPreviewControl1.Document = doc;
// 在文档生成时,显示Tags对话框
doc.ShowTagsInputDialog = true;


Wiki Markup
<span style="color: #008000">// 创建一个标签,但不要在Tags对话框显示它</span>
doc.Tags.Add(new C1.C1Preview.Tag("Statement", "Hello World!")); doc.Tags\["Statement"\].ShowInDialog = false;
<span style="color: #008000">//将显示创建的标签</span>
doc.Tags.Add(new C1.C1Preview.Tag("Name", "ComponentOne"));
doc.Tags.Add(new C1.C1Preview.Tag("Location", "Pittsburgh, PA"));
<span style="color: #008000">// 向文档添加标签并生成文档.</span>
C1.C1Preview.RenderText rt = new C1.C1Preview.RenderText(); rt.Text = "\[Statement\] My name is \[Name\] and my current location is \[Location\]."; doc.Body.Children.Add(rt); doc.Generate();
当应用程序运行时,下面的对话框将在文本生成之前显示:
!worddavcac2aff0bbd03638c8cd06c5c4390341.png|height=144,width=445!
改变Tags对话框中任何文本框中的文本,将改变出现在生成文档中的文本。请注意,Statement标签将不显示,也不能从对话框中修改。如果保留默认的文本,则将在生成的文档中产生以下文字:
Hello World! My name is ComponentOne and I'm currently located in Pittsburgh, PA.
<span style="color: #3f529c">指定<strong>Tags</strong>对话框何时显示</span>
*!MISSING PHRASE 'Show All'! !MISSING PHRASE 'Hide All'!*
当ShowTagsInputDialog属性设置为True,则会在文档生成之前显示Tags对话框。您可以通过编程方式调用EditTags方法显示该对话框,(和ShowTagsInputDialog属性的设置是完全独立的)。例如,下面的代码将会使得单击一个按钮时,显示的标签输入对话框:
*Visual Basic*


Visual Basic

Public Class Form1
Dim doc As New C1PrintDocument()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Me.C1PrintPreviewControl1.Document = doc
' 创建将用来显示的标签
doc.Tags.Add(New C1.C1Preview.Tag("Statement", "Hello World!")) doc.Tags("Statement").ShowInDialog = True doc.Tags.Add(New C1.C1Preview.Tag("Name", "ComponentOne")) doc.Tags.Add(New C1.C1Preview.Tag("Location", "Pittsburgh, PA")) ' 向文档添加标签
Dim rt As New C1.C1Preview.RenderText() rt.Text = "[Statement] My name is [Name] and my current location is


[Location]."

doc.Body.Children.Add(rt) End Sub
Private Sub EditTagsNow_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles EditTagsNow.Click ' 在单击按钮时显示Tags对话框 doc.ShowTagsInputDialog = True doc.EditTags() End Sub
Private Sub GenerateDocNow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GenerateDocNow.Click doc.ShowTagsInputDialog = False
' 单击按钮时生成文档
doc.Generate() End Sub
End Class


...

C#

C1PrintDocument doc = new C1PrintDocument(); doc.PageLayout.PageHeader = new RenderText(


Wiki Markup
  "Page \[PageNo\] of \[PageCount\]");
  PageX (整数类型)
此名称解析为当前水平方向上的从1开始计算的页码。(对于没有水平分页符的文档,将返回1。)
   PageY (整数类型)
此名称解析为当前垂直方向上的页码。(对于没有水平分页符的文档,则和PageNo相同。)
  PageXCount (整数类型)
此名称解析为文档水平方向的分页总数。(对于没有水平分页符的文档,将始终返回1。)
   PageYCount (整数类型)
此名称解析为文档的总页数。(对于没有水平分页符的文档,则和PageCount相等。)
需要着重注意的是,这里提到的任何和页面编码相关的值可以用在文档的任何地方,不一定必须放在页眉或页脚上。
   Fields(FieldCollection类型)
该变量引用数据库所有可用字段的集合,类型为C1.C1Preview.DataBinding.FieldCollection。它只能用于数据绑定的文档。例如,下面的代码将打印NWIND数据库Products数据表的产品名称列表。
*Visual Basic*


Visual Basic

Dim doc As New C1PrintDocument() Dim dSrc As New DataSource() dSrc.ConnectionProperties.DataProvider = DataProviderEnum.OLEDB dSrc.ConnectionProperties.ConnectString = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.MDB" Dim dSet1 As New C1.C1Preview.DataBinding.DataSet( _ dSrc, "select * from Products") doc.DataSchema.DataSources.Add(dSrc) doc.DataSchema.DataSets.Add(dSet1) Dim rt As New RenderText() rt.DataBinding.DataSource = dSet1 rt.Text = "[Fields!ProductName.Value]" doc.Body.Children.Add(rt)

...

C#

C1PrintDocument doc = new C1PrintDocument(); DataSource dSrc = new DataSource(); dSrc.ConnectionProperties.DataProvider = DataProviderEnum.OLEDB; dSrc.ConnectionProperties.ConnectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.MDB"; C1.C1Preview.DataBinding.DataSet dSet1 = new C1.C1Preview.DataBinding.DataSet(dSrc, "select * from Products"); doc.DataSchema.DataSources.Add(dSrc);


Wiki Markup
doc.DataSchema.DataSets.Add(dSet1); RenderText rt = new RenderText(); doc.Body.Children.Add(rt); rt.DataBinding.DataSource = dSet1; rt.Text = "\[Fields!ProductName.Value\]";
请注意在最后一行是如何通过"!"访问字段数组的元素。或者,你可以写:
*Visual Basic*


Visual Basic

rt.Text = "[Fields(\"ProductName\").Value]"

...

C#

C1PrintDocument doc = new C1PrintDocument();


Wiki Markup
DataSource dSrc = new DataSource(); dSrc.ConnectionProperties.DataProvider = DataProviderEnum.OLEDB; dSrc.ConnectionProperties.ConnectString =   @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.MDB"; C1.C1Preview.DataBinding.DataSet dSet1 =   new C1.C1Preview.DataBinding.DataSet(dSrc,  "select * from Products"); doc.DataSchema.DataSources.Add(dSrc); doc.DataSchema.DataSets.Add(dSet1); RenderText rt = new RenderText(); doc.Body.Children.Add(rt); rt.DataBinding.DataSource = dSet1; rt.Text = "\[Fields!ProductName.Value\]"; doc.DataSchema.Aggregates.Add(new Aggregate(   "AveragePrice", "Fields!UnitPrice.Value",   rt.DataBinding, RunningEnum.Document,   AggregateFuncEnum.Average)); doc.Body.Children.Add(new RenderText(   "Average price: \[Aggregates!AveragePrice.Value\]"));
   DataBinding(C1DataBinding类型)
该变量允许访问当前render对象的DataBinding属性,类型为C1.C1Preview.DataBinding.C1DataBinding。例如,
下面的代码(从展示Fileds变量用法的示例修改而来)将通过使用render对象的DataBinding属性的RowNumber 成员在文本表达式中生成一个带有编码的列表:
*Visual Basic*


Visual Basic

Dim doc As New C1PrintDocument() Dim dSrc As New DataSource() dSrc.ConnectionProperties.DataProvider = DataProviderEnum.OLEDB dSrc.ConnectionProperties.ConnectString = _ "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.MDB" C1.C1Preview.DataBinding.DataSet dSet1 = _ new C1.C1Preview.DataBinding.DataSet(dSrc, _ "select * from Products") doc.DataSchema.DataSources.Add(dSrc) doc.DataSchema.DataSets.Add(dSet1) Dim rt As New RenderText() rt.DataBinding.DataSource = dSet1 rt.Text = "[DataBinding.RowNumber]: [Fields!ProductName.Value]" doc.Body.Children.Add(rt)

...

C#

C1PrintDocument doc = new C1PrintDocument(); DataSource dSrc = new DataSource(); dSrc.ConnectionProperties.DataProvider = DataProviderEnum.OLEDB; dSrc.ConnectionProperties.ConnectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=NWIND.MDB"; C1.C1Preview.DataBinding.DataSet dSet1 = new C1.C1Preview.DataBinding.DataSet(dSrc,


Wiki Markup
  "select * from Products");
doc.DataSchema.DataSources.Add(dSrc); doc.DataSchema.DataSets.Add(dSet1);
RenderText rt = new RenderText(); rt.DataBinding.DataSource = dSet1;
rt.Text = "\[DataBinding.RowNumber\]: \[Fields!ProductName.Value\]"; doc.Body.Children.Add(rt);
 \\
<span style="color: #3f529c">筛选,分组和排序中的<strong>ID</strong>访问</span>
在筛选,分组和排序表达式,下面的ID的子集的可被访问:
 Document ( <span style="color: #1364c4">C1PrintDocument</span>类型)
 DataBinding(<span style="color: #1364c4">C1DataBinding</span>类型)
 Fields(<span style="color: #1364c4">FieldCollection</span>类型)
对于这些对象类型的详细信息,请参见文本表达式对ID的访问。
<span style="color: #3f529c">表达式访问<strong>ID</strong>用作指定<strong>Dataset</strong>中指定的计算字段</span>
在用作指定数据集指定的计算字段的表达式中,可以访问以下的ID的子集:
 Document (C1PrintDocument类型)
 Fields (FieldCollection类型)
对于这些对象类型的详细信息,请参见文本表达式中可访问的ID。
<span style="color: #3f529c">数据绑定</span>
除了可以通过代码完整的创建一个C1PrintDocument之外,也可以通过数据绑定方式创建C1PrintDocument文档。在这种情况下,实际的文件将在生成时,使用来自于数据库的数据填充之后产生。
关于数据绑定最主要的属性是位于RenderObject上的DataBinding属性,类型为C1DataBinding,允许指定由此render对象显示的数据的数据源。除此之外,数据绑定可以表示该render对象必须为数据源中全部的记录重复显示,在这种情况下,render对象成为了类似于一种条带状报表生成器的"条带"。这一点和Microsoft的RDL定义类似。
因此,数据绑定文件,文档生成包括两个阶段:•
 所有的数据绑定的render对象被选中(做为模版)并基于数据创建"真正的"render对象。
 产生的文档做为一个非数据绑定的文档进行分页。
文档可以包含数据库Schema(由C1DataSchema类型表示,包括数据库连接信息,SQL查询,等等)在内。文档中的
C1DataBinding对象可以引用该Schema的属性。如果文档中全部的数据绑定对象仅引用文档本身的C1DataSchema的属性,则该文档将变成"数据可重排的",指的是,该文档可以独立于用来生成它的程序,使用来自于数据源的数据完全重新更新并生成。
同时,C1DataBinding可以引用由Form或者任何其他创建该C1PrintDocument的程序创建的现有数据源(DataTable
等)。当然,在这种情况下,文档只能在该程序的上下文中,通过更新后的数据源重新生成,同时,保存并在稍后再次打开该文档(C1D或C1DX文件)将打断和该数据的连接关系。
<span style="color: #3f529c"><strong>Render</strong>对象上的数据绑定</span>
*!MISSING PHRASE 'Show All'! !MISSING PHRASE 'Hide All'!*
当创建一个render对象时,其数据绑定是没有初始创建的。它将在DataBinding属性被用户代码引用时创建。例如:
*Visual Basic*


Visual Basic

Dim rt As RenderText = New RenderText ' ...
If Not (rt.DataBinding Is Nothing) Then
MessageBox.Show("Data binding defined.")
End If

...

Visual Basic

Dim rt As C1.C1Preview.RenderTable = New C1.C1Preview.RenderTable rt.Style.GridLines.All = C1.C1Preview.LineDef.Default

' 表头:
Dim c As C1.C1Preview.TableCell = rt.Cells(0, 0)
c.SpanCols = 3
c.Text = "Header"

' 分组页眉:
c = rt.Cells(1, 0)
c.Text = "GroupId = [Fields!GroupId.Value]"

c.SpanCols = 3
c.Style.TextAlignHorz = C1.C1Preview.AlignHorzEnum.Center
c.Style.TextAlignVert = C1.C1Preview.AlignVertEnum.Center

' 子分组页眉:
c = rt.Cells(2, 0)
c.Text = "GroupId = [Fields!GroupId.Value] SubGroupId = [Fields!SubGroupId.Value]" c.SpanCols = 3

c.Style.TextAlignHorz = C1.C1Preview.AlignHorzEnum.Center
c.Style.TextAlignVert = C1.C1Preview.AlignVertEnum.Center

' 子分组数据:
rt.Cells(3, 0).Text = "GroupId=[Fields!GroupId.Value]"


Wiki Markup
rt.Cells(3, 1).Text = "SubGroupId=\[Fields!SubGroupId.Value\]" rt.Cells(3, 2).Text = "IntValue=\[Fields!IntValue.Value\]"
 \\
<span style="color: #008000">' 创建一组数据绑定行,按照GroupId字段进行分组:</span>
Dim g As C1.C1Preview.TableVectorGroup = rt.RowGroups(1, 3)
g.CanSplit = True
g.DataBinding.DataSource = MyData.Generate(20, 0)
g.DataBinding.Grouping.Expressions.Add("Fields!GroupId.Value")
g.Style.BackColor = Color.LightCyan
 \\
<span style="color: #008000">' 创建一个嵌套分组,按照SubGroupId字段进行分组:</span>
Dim ng As C1.C1Preview.TableVectorGroup = rt.RowGroups(2, 2) ng.CanSplit = True ng.DataBinding.DataSource = g.DataBinding.DataSource ng.DataBinding.Grouping.Expressions.Add("Fields!SubGroupId.Value") ng.Style.BackColor = Color.LightPink
 \\
<span style="color: #008000">' 创建更深一层的嵌套数据绑定分组:</span>
Dim ng2 As C1.C1Preview.TableVectorGroup = rt.RowGroups(3, 1) ng2.DataBinding.DataSource = g.DataBinding.DataSource ng2.Style.BackColor = Color.LightSteelBlue
*C#*


C#

RenderTable rt = new RenderTable(); rt.Style.GridLines.All = LineDef.Default;

// 表头:
TableCell c = rt.Cells[0, 0];
c.SpanCols = 3;
c.Text = "Header";

// 分组页眉:
c = rt.Cells[1, 0];
c.Text = "GroupId = [Fields!GroupId.Value]";
c.SpanCols = 3;
c.Style.TextAlignHorz = AlignHorzEnum.Center;
c.Style.TextAlignVert = AlignVertEnum.Center;

// 子分组页眉:
c = rt.Cells[2, 0];
c.Text = "GroupId = [Fields!GroupId.Value] SubGroupId = [Fields!SubGroupId.Value]"; c.SpanCols = 3;
c.Style.TextAlignHorz = AlignHorzEnum.Center;
c.Style.TextAlignVert = AlignVertEnum.Center;

// 子分组数据:
rt.Cells[3, 0].Text = "GroupId=[Fields!GroupId.Value]"; rt.Cells[3, 1].Text = "SubGroupId=[Fields!SubGroupId.Value]"; rt.Cells[3, 2].Text = "IntValue=[Fields!IntValue.Value]";


Wiki Markup
 \\
<span style="color: #008000">// 创建一组数据绑定行,按照GroupId字段进行分组:</span>
TableVectorGroup g = rt.RowGroups\[1, 3\];
g.CanSplit = true;
g.DataBinding.DataSource = MyData.Generate(20, 0);
g.DataBinding.Grouping.Expressions.Add("Fields!GroupId.Value");
g.Style.BackColor = Color.LightCyan;
 \\
<span style="color: #008000">// 创建一个嵌套分组,按照SubGroupId字段进行分组:</span>
TableVectorGroup ng = rt.RowGroups\[2, 2\]; ng.CanSplit = true; ng.DataBinding.DataSource = g.DataBinding.DataSource; ng.DataBinding.Grouping.Expressions.Add("Fields!SubGroupId.Value"); ng.Style.BackColor = Color.LightPink;
 \\
<span style="color: #008000">// 创建更深一层的嵌套数据绑定分组:</span>
TableVectorGroup ng2 = rt.RowGroups\[3, 1\]; ng2.DataBinding.DataSource = g.DataBinding.DataSource; ng2.Style.BackColor = Color.LightSteelBlue;
以上代码可以由以下表格演示:


 

 

 

Header

 

 

Group
1, 3

 

 

GroupId = [Fields!GroupId.Value]

 

 

 

Group
2, 2

 

GroupId = [Fields!GroupId.Value] SubGroupId = [Fields!SubGroupId.Value]

 

 

 

 

Group
3, 1

GroupId=
[Fields!GroupId.Value]

SubGroupId=
[Fields!SubGroupId.Value]

IntValue=

[Fields!IntValue.Value]

...

C#

// 创建一个对每一个分组重复的Render区域:
RenderArea ra = new RenderArea(); ra.Style.Borders.All = new LineDef("2mm", Color.Blue); ra.DataBinding.DataSource = MyData.Generate(20, 0, true); ra.DataBinding.Grouping.Expressions.Add("Fields!GroupId.Value");

// 创建一个用于计算每一个分组中IntValue字段之和的汇总calc the sum of IntValue fields within


Wiki Markup
<span style="color: #008000">each group:</span> Aggregate agg = new Aggregate("Group_IntValue");
 \\
<span style="color: #008000">// 定义计算求和的表达式:</span>
agg.ExpressionText = "Fields!IntValue.Value";
 \\
<span style="color: #008000">// 指定该汇总操作应当针对当前分组范围:</span>
agg.Running = RunningEnum.Group;
 \\
<span style="color: #008000">// 指定汇总操作的数据源:</span>
agg.DataBinding = ra.DataBinding;
 \\
<span style="color: #008000">//添加汇总至文档:</span>
doc.DataSchema.Aggregates.Add(agg);
 \\
<span style="color: #008000">// 创建一个用于计算每一个分组中IntValue字段之和的汇总:</span>
agg = new Aggregate("Total_IntValue");
 \\
<span style="color: #008000">// 定义用作计算求和的表达式:</span>
agg.ExpressionText = "Fields!IntValue.Value";  <span style="color: #008000">// Specify that aggregate should have document scope:</span> agg.Running = RunningEnum.All;
 \\
<span style="color: #008000">// 指定汇总操作的数据源:</span>
agg.DataBinding = ra.DataBinding;
 \\
<span style="color: #008000">//添加汇总至文档:</span>
doc.DataSchema.Aggregates.Add(agg);
 \\
<span style="color: #008000">// 添加分组页眉:</span>
RenderText rt = new RenderText(); rt.Text = "GroupId: \[Fields!GroupId.Value\]"; rt.Style.BackColor = Color.Yellow; ra.Children.Add(rt);
 \\
<span style="color: #008000">// 该呈现文本将打印分组记录;和可以看到的那样,分组汇总的值不仅仅可以在分组页脚中引用,也可以在分组页眉和分组内容区域引用 :</span>
rt = new RenderText(); rt.Text = "GroupId: \[Fields!GroupId.Value\]\rIntValue:\[Fields!IntValue.Value\]\rGroup_IntValue:
\[Aggregates!Group_IntValue.Value\]\rTotal_IntValue:
\[Aggregates!Total_IntValue.Value\]\rTatalNested_IntValue: \[Aggregates!TatalNested_IntValue.Value\]";
rt.Style.Borders.Bottom = LineDef.Default; rt.Style.BackColor = Color.FromArgb(200, 210, 220); rt.DataBinding.DataSource = ra.DataBinding.DataSource; ra.Children.Add(rt);
 \\
<span style="color: #008000">// 该汇总也在分组内进行计算,但是关联到内嵌对象的数据绑定:</span>
agg = new Aggregate("TotalNested_IntValue"); agg.ExpressionText = "Fields!IntValue.Value"; agg.Running = RunningEnum.All; agg.DataBinding = rt.DataBinding; doc.DataSchema.Aggregates.Add(agg);
 \\
<span style="color: #008000">// 添加该区域至文档:</span>
doc.Body.Children.Add(ra);
注意:也有可以在数据绑定的C1PrintDocuments使用的汇总类型,他们不需要声明在文档的汇总集合(Aggregates)。更多的细节和例子,请参见数据汇总主题。.
<span style="color: #3f529c">数据汇总</span>
*!MISSING PHRASE 'Show All'! !MISSING PHRASE 'Hide All'!*
在发布的2010 V1版本中,向Reports for WinForms添加了新的汇总。这些汇总类型可以应用在数据绑定的<span style="color: #1364c4">C1PrintDocument</span>中,而不需要在文档的汇总集合(<span style="color: #1364c4">Aggregates</span>)中声明它们。
例如,如果"Balance"是一个数据绑定文档的数据字段,以下<span style="color: #1364c4">RenderText</span>可以用于打印数据集的余额总量:
*Visual Basic*


Visual Basic

Dim rt As New RenderText("[Sum(""Fields!Balance.Value"")]")

...

当然这仅仅是一个简单的可能的应用场景,用来演示在创建索引时包含的主要对象之间的关系。其他一些可能的用法,包括在创建文档之前(基于一个外部的项目字典)创建索引项(索引条目),添加内嵌的条目(子条目)等等。
自定义索引的外观

自定义索引的外观


Wiki Markup
以下属性用来自定义生成的索引的外观:
*Styles* (参见 *Styles{*}):
<span style="color: #1364c4">Style</span>:指定整个索引的样式(包括标题,条目,等等)。
<span style="color: #1364c4">HeadingStyle</span>:指定用作字母标题的样式(标题指的是一组条目,首字母以该字母开头)。在生成的索引中,每一个标题(通常是位于某个以该字母开头的分组之前)由一个独立的render对象(RenderText)表示,该对象将应用此样式。
  <span style="color: #1364c4">EntryStyles</span>:一个具有索引下标表示的属性,指定不同级别条目的样式。例如,EntryStyles\[0\](VB中为
EntryStyles(0))指定最顶级条目的样式,EntryStyles\[1\](VB中为EntryStyles(1))指定子条目的样式,以此类推。(如果索引中的内嵌级别高于EntryStyles集合中项目的个数,则对于多出的内嵌级别,将使用集合中的最后一个样式。)
 在生成的索引中,每一个条目(一个紧随着其出现位置页码的项)由一个独立的 <span style="color: #1364c4">RenderParagraph</span>对象表示,在该对象中应用由该属性指定的对应内嵌级别的样式。例如,该样式允许指定一个条目文本在允许插入一个换页之前,所必须出现的最小行数(通过<span style="color: #1364c4">MinOrphanLines</span>)。
<span style="color: #1364c4">EntryStyle</span>:这是指向EntryStyles集合中的第一个元素(索引值为0)的快捷方式。
<span style="color: #1364c4">SeeAlsoStyle</span>:允许指定用作在条目间互相引用的"see also"的文本样式(参见SeeAlso)。
<span style="color: #1364c4">Style</span>:允许为一个特定的条目单独覆盖其样式。
<span style="color: #1364c4">SeeAlsoStyle</span>:允许为某一个特定的条目覆盖其"see also"文本的样式。
其他属性:其他属性: 
<span style="color: #1364c4">RunIn</span>:一个布尔型值(默认值为False),如果设置为True,表示子条目应当和主标题显示在同一行,而不是缩进显示为单独的行。
<span style="color: #1364c4">EntryIndent</span>:一个带单位的属性,指定子条目相对于主条目的缩进值。默认值为0.25英寸。
<span style="color: #1364c4">EntryHangingIndent</span>:一个带单位的属性,指定一个条目的首行相对于其他行的缩进值(相对于左侧),通常应用于显示为多行的情况。默认值为-0.125英寸。
<span style="color: #1364c4">LetterSplitBehavior</span>:一个SplitBehaviorEnum类型的属性,确定一个字母分组(以相同首字母开始的条目)如何在垂直方向上分开。默认值为SplitBehaviorEnum.SplitIfNeeded。注意标题(默认显示该分组的首字母)始终和第一个条目一起显示。
<span style="color: #1364c4">Italic</span>:和Bold类似,不过使用斜体显示而不是粗体。
<span style="color: #1364c4">LetterFormat</span>:用作格式化字母标题的字符串。默认值为"\{0\}"。
<span style="color: #1364c4">TermDelimiter</span>:用来分隔条目项和该项出现位置列表(页码)的字符串。默认值为一个逗号跟上一个空格。
<span style="color: #1364c4">RunInDelimiter</span>:用作当一个run-in类型(参见RunIn)的索引生成时,用作分隔不同条目的字符串。默认值为分号。
<span style="color: #1364c4">OccurrenceDelimiter</span>:一个用作分隔每一个条目出现位置列表(页码)的字符串,默认值为一个逗号带着一个空格。
<span style="color: #1364c4">PageRangeFormat</span>:一个用作格式化条目出现位置页码范围的字符串,默认值为"\{0\}-\{1\}"。
<span style="color: #1364c4">SeeAlsoFormat</span>:用作格式化"see also"引用的字符串。默认值为"(see\{0\})"(一个空格,接下来是左括号,在紧接着是输出格式化项目,最后是右括号)。
<span style="color: #1364c4">FillChar</span>:当页码向右对齐时,用作填充的字符(PageNumbersAtRight属性设置为True)。该属性的默认值为一个点字符。
<span style="color: #1364c4">PageNumbersAtRight</span>:一个布尔类型的属性,决定是否向右对齐页码。默认值为False。
<span style="color: #1364c4">EntrySplitBehavior</span>:一个SplitBehaviorEnum类型的属性,确定如何在垂直方向分隔一个单独的条目。默认值为 SplitBehaviorEnum.SplitIfLarge。该属性应用到全部级别的条目。
<span style="color: #1364c4">Bold</span>:一个布尔型的值,允许通过粗体高亮显示某个条目的某个特定的出现位置。(例如,这可以用做高亮显示某个条目出现的主要定义的位置。)<span style="color: #3f529c">索引样式层次</span>
The hierarchy of index-specific styles is as follows:
<span style="color: #1364c4">Style</span>, 用作RenderIndex对象,做为其他索引特定样式的AmbientParent
<span style="color: #1364c4">HeadingStyle</span>
<span style="color: #1364c4">EntryStyles</span>
<span style="color: #1364c4">Style</span>
<span style="color: #1364c4">SeeAlsoStyle</span>
<span style="color: #1364c4">SeeAlsoStyle</span>
除了RenderIndex的Style之外,以上所列出的全部样式做为相关对象内联样式的Parent以及AmbientParent。因此比如说,设置RenderIndex的Style上的字体将影响该索引中全部元素(除了被低层次样式覆盖的以外),指定该样式上的边框将在整个索引绘制一个边框,但是每一个单独的元素则不受影响。与此同时,指定SeeAlsoStyle的边框将在每一个索引中的"see also"元素绘制一个边框。
<span style="color: #3f529c">生成索引的结构</span>
下图显示在生成文档时由一个RenderIndex对象创建的render对象的树形结构和层次关系(这里,仅仅最顶层的 RenderIndex对象由用户代码创建;其他对象为自动生成):
*RenderIndex*
*_RenderArea_* (表示一个具有相同首字母的项目分组)
*_RenderText* (prints letter group header)_
*_RenderParagraph_* (prints top-level *IndexEntry{*})
*_RenderParagraph_* (prints sub-entry, offset via *Left{*})
*...*
*_RenderArea_* (represents a group of entries starting with the same letter)
*_RenderText_* (prints letter group header)
*_RenderParagraph_* (prints top-level *IndexEntry{*})
*_RenderParagraph_* (prints sub-entry, offset via *Left{*})
*...* <span style="color: #3f529c">大纲视图</span>
C1PrintDocument支持大纲视图。大纲视图是一个具有指向文档中位置的节点(OutlineNode类型)的树形结构(由 Outlines属性指定)。大纲视图在预览的导航面板的一个标签页中显示,允许通过单击其中的某个项目导航到关联到该项目的相关位置。同时,大纲视图可以导出到支持该标记的文件格式(比如说PDF)。
使用Outline的任意一个构造器重载创建一个大纲节点。可以指定该大纲节点的文本,在文本中指向的位置(一个render 对象或者一个锚点),以及在预览时大纲树形视图面板上显示的图标。顶级的节点应当添加到文档的Outlines集合。每一个大纲节点可以按照顺序在Children集合中按照顺序包含子节点集合,层层嵌套。


提示:每一个大纲视图节点项目可以被单击。单击一个节点将会显示关联到该节点的项目。关于如何添加大纲视图节点的示例,请参见Adding Outline Entries to the Outline Tab.

...