Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

如上所述,在TableVectorGroupCollection中的索引第一个值是包括在该组中的第一行的索引(在上面的代码示例中,为0)。第二个值表示分组中的行数(在上面的代码示例中,为2)。
访问分组列,请使用ColGroups集合该集合和行分组的集合具有相同的类型(TableVectorGroupCollection)特别感兴趣的是指定一组列为垂直的表格页眉或页脚的能力。C1PrintDocument 支持"水平的"或者("extension")的页面,允许宽对象水平横跨多个页面。为允许一个对象(例如,一个表)水平横跨几个页面,需要设置其SplitHorzBehavior 属性为一个不为SplitBehaviorEnum.Never的值如果对象的宽度超过页面宽度越宽,它将被分割为若干个水平页。特别是,一个过宽的表可以这样分割。为了让一组列沿着每一个页面的左侧重复显示,需要设置分组的ColumnHeader为了让一组列沿着每一页的右边缘重复显示,需要设置分组的ColumnFooter属性为True。

Image Removed Image Added 注意:注意:虽然表格的任何一组行(或列)可以被指定为页脚,通常你会想只包括表格的最后一行(或列)至页脚组。这将确保页脚的行为作为一个正常的页脚,只出现在页面的底部(或右边缘),也出现在表的末尾。(如果,例如,你把一个表的第一行指定为页脚,它仍然会出现在表格的开始位置,因此也不会打印在表格的结束位置。)

...

表格中的样式
虽然表格的单元格,列,以及行不是render对象(它们没有继承自RenderObject)但是,它们都具有Style属性。
操纵样式将影响到相关的元素以及其全部的内容。设置一行的样式将影响到该行中全部的单元格。设置一列的样式将影响到该列中全部的单元格。位于行和列交叉位置的单元格的样式将会是指定到该行以及该列的样式的一个组合结果。
如果同一个样式属性同时在行上和列上进行设置,则列上的属性值将起作用。
此外,分组(行分组,列分组以及用户单元格分组)都有自己的样式,这也影响到单元格中的数据显示,同时也影响表格的行和列。
以下规则支配表格中样式的应用:
环境样式属性穿透表格元素进行传播(整个表格,行以及列分组,单元格分组,单独的行和列,以及单个单元格),基于几何上的包含关系,这一点和表格外部的render对象的包含关系继承环境样式属性的机制是类似的。
环境属性影响单元格的内容,而不影响这些容器元素。例如,设置整个表格的样式上的字体,将影响此表格中全部的文本,除非在某个低层次显式地设置了其字体。类似地,设置一行的样式的字体将影响该行内所有单元格的字体。
当一个特定的环境属性两个以上的表格元素改变时,以下优先级顺序将用来计算最终用来绘制单元格的属性的有效值:单元格自身的样式(具有最高的优先级)
UserCellGroup样式,如果单元格包含在其中 列样式
列分组样式,如果存在的话 行样式 行分组样式,如果存在的话
表格样式(具有最低的优先级)
设置在表格元素样式上的非环境属性如上面所列(整个表格,列和行的分组,行,列以及单元格),将应用到这些元素自身,而不会影响单元格的内容,即使这些元素不是render对象(整个表格对象除外)。例如,为了在表格中的一行绘制一个边框,可以设置该行的Style.Border的值为期望值。
为了设置表格中全部单元格的非环境样式属性,请使用RenderTable.CellStyle。如果指定了该属性,该样式将实际上做为单元格内render对象样式的父样式。
CellStyle属性同样定义在行,列以及表格元素分组上,如果指定了这些样式,将影响单元格内部对象的非环境属性。例如,设置在一个表格中的所有单元格的背景图像,可以设置表格的CellStyle.BackgroundImage属性这将在表格中的全部
单元格中重复该图像,而设置表格的Style.BackgroundImage属性则会将该图像做为整个表格的背景(如果图像为拉伸显示,则两种模式下区别相当明显)。
锚点和超链接
Reports for WinForms 超链接。超链接可以附加到render对象上(RenderObject以及其派生类),以及段落对象上
(ParagraphObject以及其派生类),并可以链接到:
位于当前文档的锚点。
位于另一个C1PrintDocument文档内的锚点。
位于当前文档内的一个位置。
一个外部文件。
当前文档中的某一页。
一个用户事件。
C1.Win.C1Preview 程序集中的各个预览控件支持超链接(C1PreviewPane,C1PrintPreviewControl 以及
C1PrintPreviewDialog)。当一个具有超链接的文档进行预览时,鼠标悬停到一个超链接上方会导致光标变成一个手的形状。按照链接目标的不同,单击这个超链接会有以下可能的效果,跳转至文档中的其他位置,打开另一个文档并跳转至其中的某个位置,打开一个外部文件,或者调用一个用户事件。

Image Removed Image Added 注意:注意:在以下主题中的代码片段均已经假设在文件中添加了"using C1.C1Preview"指令(C#语法;或者其他语法

...

C#

C1PrintDocument doc = new C1PrintDocument();
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="d3641d55-58e8-417c-9dcd-493214bf3468"><ac:plain-text-body><![CDATA[doc.Body.Children.Add(new RenderText("2 + 2 = [2+2]"));

]]></ac:plain-text-body></ac:structured-macro>


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


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


Wiki Markup
插入文档。
<span style="color: #3f529c">标签</span>
*!MISSING PHRASE 'Show All'!*
*!MISSING PHRASE 'Hide All'!*
标签与表达密切相关。事实上,标签是变量,可在表达式中使用,或者简单地作为表达式。标签允许您在希望向某个目标位置插入某个特定的字符串,但尚未确定该字符串的值的情况下,使用一个占位符。一个标签的典型例子是页码,您
需要打印页码,但是目前还无法确认页码到底显示什么,或者在文档重新生成时,页码还可能发生变化。
 \\
标签有两个主要的属性: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#

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="2184abb0-3391-42b0-b9b2-680bbde1b303"><ac:plain-text-body><![CDATA[

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

]]></ac:plain-text-body></ac:structured-macro>


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


Visual Basic

Dim doc As New C1PrintDocument()
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="6224c47e-f730-4ad3-af7c-acfdaae3c319"><ac:plain-text-body><![CDATA[doc.Body.Children.Add(new RenderText("2 + 2 = \\[2+2
]"))

]]></ac:plain-text-body></ac:structured-macro>

...

C#

C1PrintDocument doc = new C1PrintDocument();
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1939dfa6-5021-408f-8ebc-1e2af3ffb592"><ac:plain-text-body><![CDATA[doc.Body.Children.Add(new RenderText("2 + 2 = \\[2+2
]"));

]]></ac:plain-text-body></ac:structured-macro>


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>
*!MISSING PHRASE 'Show All'!*
*!MISSING PHRASE 'Hide All'!*
默认情况下,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"))
' 向文档添加标签并生成文档.
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="6e05c6ac-5f06-488b-a041-fb84f0f062fb"><ac:plain-text-body><![CDATA[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()

]]></ac:plain-text-body></ac:structured-macro>

...

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")) ' 向文档添加标签
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="7b0ec91f-2e81-4ef4-a243-6bd408d32fd2"><ac:plain-text-body><![CDATA[ Dim rt As New C1.C1Preview.RenderText() rt.Text = "[Statement] My name is [Name] and my current location is

]]></ac:plain-text-body></ac:structured-macro>

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="4193727e-7c41-45ad-b740-efcef18a1094"><ac:plain-text-body><![CDATA[

[Location]."
]]></ac:plain-text-body></ac:structured-macro>
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

...

doc.Generate();
}
}
在上面的例子中,单击EditTagsNow按钮时,会显示Tags对话框。
定义默认Tags对话框
通过向工程添加继承自TagsInputForm或者TagsInputFormBase的窗体,您可以很容易地自定义Tags对话框。具体使用哪一种方式取决于您是打算对窗体做一些小改动还是希望彻底地重新定义该窗体。

做一些小小的变动

如果您仅仅是希望在默认的窗体上做一些小改动(比如,添加一个帮助按钮),您可以添加一个继承自TagsInputForm 的窗体到工程,按照需要对其进行调整,并指定该窗体的类型名至文档的TagsInputDialogClassName属性。
例如,在下面的窗体中,标题栏上添加了一个帮助按钮,并且窗体的背景色发生了变化:

彻底改变窗体

如果您希望,您可以彻底改变默认的窗体。例如,您可以提供您自己的用来输入标签值的控件,等等。为了达到这一点,您需要将Form继承自TagsInputFormBase,按照需要修改,并重写EditTags方法。
脚本/表达式语言
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
表达式使用的语言由C1PrintDocument.ScriptingOptions.Language属性的值决定。这个属性可以是以下几个值之一:
VB. 这是默认值,表示使用标准VB.NET作为脚本语言。
C1Report. 该值表示将使用C1Report脚本语言。该语言类似VB,但是有一些细微的差别。该选项主要为了提供向后兼容性。
CSharp. 该值表示将使用标准的C#作为脚本语言。
如果用VB语言作为表达式语言,则当文档生成时,将在内部为每一个表达式构件一个独立的程序集,每一个程序集包含一个从ScriptExpressionBase派生的类型。该类型包含protected的属性,可以被表达式使用。表达式本身是作为一个类的函数实现。
例如:
Visual Basic

Visual Basic

Dim doc As New C1PrintDocument()
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="746c3eb2-58ac-4823-bff3-6c81bd98014c"><ac:plain-text-body><![CDATA[doc.ScriptingOptions.Language = ScriptLanguageEnum.CSharp Dim rt As New RenderText("[PageNo == 1 ? ""First"" : ""Not first""]") doc.Body.Children.Add(rt)

]]></ac:plain-text-body></ac:structured-macro>

...

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

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="465acdcd-714f-437a-9e7c-4fa85290b047"><ac:plain-text-body><![CDATA[

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)

]]></ac:plain-text-body></ac:structured-macro>

...

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

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="d71e6131-93ea-4fdb-b4ac-8fe1c37fb6f0"><ac:plain-text-body><![CDATA[

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

]]></ac:plain-text-body></ac:structured-macro>

...

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

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="c2fb5b24-a5fa-4bb6-8694-7599fc575529"><ac:plain-text-body><![CDATA[

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)

]]></ac:plain-text-body></ac:structured-macro>

...

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

...

C#

RenderText rt = new RenderText(); // ... if (rt.DataBindingDefined) {
MessageBox.Show("Data binding defined.");
}

Image Removed Image Added 注意:注意:这一点和WinForms平台下Control类型的Handle以及IsHandleCreated属性类似。

...

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)
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="df8982e7-210e-4aec-b28f-72955e0d670a"><ac:plain-text-body><![CDATA[c.Text = "GroupId = [Fields!GroupId.Value]"
]]></ac:plain-text-body></ac:structured-macro>
c.SpanCols = 3
c.Style.TextAlignHorz = C1.C1Preview.AlignHorzEnum.Center
c.Style.TextAlignVert = C1.C1Preview.AlignVertEnum.Center

' 子分组页眉:
c = rt.Cells(2, 0)
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="4c4e5538-a9dc-463b-bfe9-069565426cb9"><ac:plain-text-body><![CDATA[c.Text = "GroupId = [Fields!GroupId.Value] SubGroupId = [Fields!SubGroupId.Value]" c.SpanCols = 3
]]></ac:plain-text-body></ac:structured-macro>
c.Style.TextAlignHorz = C1.C1Preview.AlignHorzEnum.Center
c.Style.TextAlignVert = C1.C1Preview.AlignVertEnum.Center

' 子分组数据:
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="48b9aae9-d651-4c8a-837e-edb5c6911bae"><ac:plain-text-body><![CDATA[rt.Cells(3, 0).Text = "GroupId=[Fields!GroupId.Value]"

]]></ac:plain-text-body></ac:structured-macro>


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;

// 表头:
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1936199d-f1a0-4cec-916e-38586222c1e4"><ac:plain-text-body><![CDATA[TableCell c = rt.Cells[0, 0];
]]></ac:plain-text-body></ac:structured-macro>
c.SpanCols = 3;
c.Text = "Header";

// 分组页眉:
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="8acab00a-39c8-4904-82be-94c7e1934e27"><ac:plain-text-body><![CDATA[c = rt.Cells[1, 0];
]]></ac:plain-text-body></ac:structured-macro>
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="f3f3f87f-bba3-42f7-95e1-16d7e68e0152"><ac:plain-text-body><![CDATA[c.Text = "GroupId = [Fields!GroupId.Value]";
]]></ac:plain-text-body></ac:structured-macro>
c.SpanCols = 3;
c.Style.TextAlignHorz = AlignHorzEnum.Center;
c.Style.TextAlignVert = AlignVertEnum.Center;

// 子分组页眉:
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="7dcb41c6-3799-4cbf-87cf-ba9784acf5e1"><ac:plain-text-body><![CDATA[c = rt.Cells[2, 0];
]]></ac:plain-text-body></ac:structured-macro>
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="3ce78932-e736-492e-b41f-9f0adffbfc91"><ac:plain-text-body><![CDATA[c.Text = "GroupId = [Fields!GroupId.Value] SubGroupId = [Fields!SubGroupId.Value]"; c.SpanCols = 3;
]]></ac:plain-text-body></ac:structured-macro>
c.Style.TextAlignHorz = AlignHorzEnum.Center;
c.Style.TextAlignVert = AlignVertEnum.Center;

// 子分组数据:
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="3bd7c925-d267-4614-ab2d-3afc591090a8"><ac:plain-text-body><![CDATA[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]";

]]></ac:plain-text-body></ac:structured-macro>


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
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="8c96d773-1b2c-47f6-bf74-b77e83f8035a"><ac:plain-text-body><![CDATA[1, 3

 

 

GroupId = [Fields!GroupId.Value]

 

 

]]></ac:plain-text-body></ac:structured-macro>

 

Group
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="a99b23b2-08ca-4c98-99ea-5f8ca6c62557"><ac:plain-text-body><![CDATA[2, 2

 

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

 

 

]]></ac:plain-text-body></ac:structured-macro>

 

 

Group
3, 1

GroupId=
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="559442ca-49d4-407c-b86c-05a472c0b2ac"><ac:plain-text-body><![CDATA[[Fields!GroupId.Value]

SubGroupId=
]]></ac:plain-text-body></ac:structured-macro>
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="c92411b9-5a82-4b35-b713-fa43195ba003"><ac:plain-text-body><![CDATA[[Fields!SubGroupId.Value]

IntValue=
]]></ac:plain-text-body></ac:structured-macro>
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="e1c71bb8-6793-4866-bcc5-27a7f96eb506"><ac:plain-text-body><![CDATA[[Fields!IntValue.Value]

]]></ac:plain-text-body></ac:structured-macro>

...

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

<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="48b82260-73e1-46c2-b199-4e2b7b568b6a"><ac:plain-text-body><![CDATA[

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

]]></ac:plain-text-body></ac:structured-macro>

...

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

自定义索引的外观


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集合中按照顺序包含子节点集合,层层嵌套。


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

...