在表格中,影响对象显示的样式数量大大增加。除了正常的包含关系(表,和文件所有其他的元素,包含在另一个渲染对象,或在文档的正文最顶层),表中对象至少属于一个单元格,行或列,所有这一切都有自己的风格。此外,一个对象可以属于多个表格元素分组,这将变得更加复杂。关于表格中的样式如何工作,其细节将在"表格中的样式"主题中进行讨论。表格
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
表格由RenderTable类的实例表示。创建一个表格,只需要调用它的构造函数,比如像这样:
Visual Basic
...
在任何时候,您可以通过查询Cols.Count(返回当前列数)和Rows.Count(返回当前行数)属性的值,获取表格当前的尺寸大小。
访问单元格,列和行
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
和Tables主题中可以看到的示例代码一样,表格中全部的单元格由Cells集合表示,其类型为TableCellCollection。该集
合中的元素表示单个单元格,其类型为TableCell。为访问表格中的任意单元格,Cells集合可以按照单元格所在行和列的索引进行访问,就像这样:
Visual Basic
...
表格的列通过Cols集合进行访问,其类型为TableColCollection,它包含TableCol类型的元素。和单元格一样,只要触及某个列,将创建该列。例如,如果你设置一个列的Style属性,但如果该列不存在就将会创建该列。
表格的行通过Rows集合进行访问,其类型为TableRowCollection,它包含TableRow类型的元素。同单元格以及列一
样,只要触及某个行,如果该行不存在将创建该行。例如,如果你设置一行的高度,则该行(以及它之前的所有行)将自动被创建。
请注意,所有的不包含具有实际内容的表格行将具有为零的高度,因此在呈现该表格时为不可见。
表格以及列宽,行高
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
C1PrintDocument表格中的行和列均可以为自动计算尺寸,但是行和列的默认行为有所不同。默认情况下,行的高度为自动计算(按照该行单元格的内容进行计算),而列的宽度为固定值。RenderTable的默认宽度下面的代码将创建一个页面等宽的表格,具有三个宽度相等的列,以及10行按照单元格的内容自动计算高度的行:
Visual Basic
...
修改后的代码使得表格中的每一列的宽度适显示应该列中单元格全部文本的宽度。
行和列的分组,页眉和页脚
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
元素组表功能是表格提供的强大功能。分组允许将表格的若干元素作为一个整体访问(例如,可以为分组设置样式,就好像它是一个独立的元素)。支持列的分组,行的分组以及单元格分组。
访问分组行,请使用RowGroups集合(其类型为TableVectorGroupCollection)。该集合的元素类型为
TableVectorGroup。另一个有趣的属性是ColumnHeader该属性允许指定一组行为一个表格页眉,将在每一个新页面或者页面分栏的顶部进行重复。一个相关的属性是ColumnFooter,它允许指定一组行为一个表格页脚,同样也可以在每一页或者每一个页面分栏的末尾重复显示。
以下代码行显示如何指定一个表格的开始两行为表格页眉,在每一个分页符或者分栏符之后重复显示(这里的rt1是一个RenderTable对象):
Visual Basic
Visual Basic |
rt1.RowGroups(0, 2).Header = C1.C1Preview.TableHeaderEnum.Page |
C#
C# |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="a48ccfd1-5862-45f4-9fc4-adc93864c497"><ac:plain-text-body><![CDATA[ | rt1.RowGroups[0, 2].Header = C1.C1Preview.TableHeaderEnum.Page; | ]]></ac:plain-text-body></ac:structured-macro> |
如上所述,在TableVectorGroupCollection中的索引第一个值是包括在该组中的第一行的索引(在上面的代码示例中,为0)。第二个值表示分组中的行数(在上面的代码示例中,为2)。
访问分组列,请使用ColGroups集合该集合和行分组的集合具有相同的类型(TableVectorGroupCollection)特别感兴趣的是指定一组列为垂直的表格页眉或页脚的能力。C1PrintDocument 支持"水平的"或者("extension")的页面,允许宽对象水平横跨多个页面。为允许一个对象(例如,一个表)水平横跨几个页面,需要设置其SplitHorzBehavior 属性为一个不为SplitBehaviorEnum.Never的值如果对象的宽度超过页面宽度越宽,它将被分割为若干个水平页。特别是,一个过宽的表可以这样分割。为了让一组列沿着每一个页面的左侧重复显示,需要设置分组的ColumnHeader为了让一组列沿着每一页的右边缘重复显示,需要设置分组的ColumnFooter属性为True。
...
Visual Basic |
'创建并填充表格. Dim rt1 As C1.C1Preview.RenderTable = New C1.C1Preview.RenderTable() Dim row As Integer = 0 Dim col As Integer Do While (row < 100) col = 0 Do While (col < 6) rt1.Cells(row, col).Text = String.Format("Text in cell({0}, {1})", row, col) col += 1 Loop row += 1 Loop
' 设置表格和列的宽度 rt1.Width = C1.C1Preview.Unit.Auto col = 0 Do While (col < 6) rt1.Cols(col).Width = "1in" col += 1 Loop
' 指定前两行作为页眉,同时设置其背景. rt1.RowGroups(0, 2).PageHeader = True rt1.RowGroups(0, 2).Style.BackColor = Color.Red
'指定最后两行作为页脚,同时设置其背景. rt1.RowGroups(98, 2).PageFooter = True rt1.RowGroups(98, 2).Style.BackColor = Color.Blue
'指定第一列作为页眉. rt1.ColGroups(0, 1).PageHeader = True rt1.ColGroups(0, 1).Style.BackColor = Color.BlueViolet
' 指定最后一列作为页眉. rt1.ColGroups(5, 1).PageFooter = True rt1.ColGroups(5, 1).Style.BackColor = Color.BurlyWood |
C#
C# |
//创建并填充表格. <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="54f2b01a-60d5-40c7-b9f0-43ca491f76a2"><ac:plain-text-body><![CDATA[ RenderTable rt1 = new RenderTable(); for (int row = 0; row < 100; ++row) { for (int col = 0; col < 6; ++col) { rt1.Cells[row, col].Text = string.Format("Text in cell({0}, {1})", row, col); } ]]></ac:plain-text-body></ac:structured-macro>
}
// 设置表格和列的宽度 <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="f54be72c-c218-47cf-839d-b3f94c043664"><ac:plain-text-body><![CDATA[ rt1.Width = Unit.Auto; for (int col = 0; col < 6; ++col) { rt1.Cols[col].Width = "1in"; } ]]></ac:plain-text-body></ ac:structured-macro> // 指定前两行作为页眉,同时设置其背景. <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="b3181e67-d806-4991-bc26-01a8eaa47afc"><ac:plain-text-body><![CDATA[rt1.RowGroups[0, 2].PageHeader = true; rt1.RowGroups[0, 2].Style.BackColor = Color.Red; ]]></ac:plain-text-body></ac:structured-macro> //指定最后两行作为页脚,同时设置其背景. <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="19f05d64-f2cf-4055-b0dd-18cb398d9695"><ac:plain-text-body><![CDATA[rt1.RowGroups[98, 2].PageFooter = true; rt1.RowGroups[98, 2]. Style.BackColor = Color.Blue; ]]></ac:plain-text-body></ac:structured-macro> //指定第一列作为页眉. <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="1ddc36bd-ee1f-40b3-889f-f1e76af092e6"><ac:plain-text-body><![CDATA[rt1.ColGroups[0, 1].PageHeader = true; rt1.ColGroups[0, 1].Style.BackColor = Color.BlueViolet; ]]></ac:plain-text-body></ ac:structured-macro> // 指定最后一列作为页眉. <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="e8a5b489-01c5-4f9d-aba9-e6283dd8323c"><ac:plain-text-body><![CDATA[rt1.ColGroups[5, 1].PageFooter = true; rt1.ColGroups[5, 1].Style.BackColor = Color.BurlyWood; | ]]></ac:plain-text-body></ac:structured-macro> |
在本示例中,背景色用来突出显示行和列的分组。
用户单元格分组
单元格,甚至表格中彼此互不相邻的单元格,可以被统一到一个分组。然后您可以通过一条命令,设置该分组中全部单元格的样式。定义一个用户单元格分组:
...
的等效语句),因此我们可以只书写类名部分(比如说RenderText)而不是使用完全限定类型名称
(C1.C1Preview.RenderText)。
添加一个到同一个文档内部一个锚点的超链接
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
您需要做两件事情以便将一个文档中的一个部分链接到另一个部分:
创建一个链接指向的位置(称作一个锚点)。
为文档的另一个部分添加一个链接(一个超链接)指向此位置(当然,可以让几个不同的超链接指向同一个锚点)。
为了在一个render对象上创建一个锚点,您可以向该render对象的Anchors集合添加一个元素(C1Anchor类型)。例如,如果rt是一个RenderTable对象,则您可以添加以下代码:
Visual Basic
...
当然,您必须添加两个相关的render对象(一个包含锚点,另一个包含该超链接)至该文档。
Hyperlink是RenderObject类的一个属性,此类是全部render对象的基类,因此,和上面显示的方式相同,任何一个 render对象可以通过设置该属性转换为一个超链接。
添加一个到另一个C1PrintDocument中的某个锚点的超链接
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'! 将一个文档中的一个位置链接到另一个文档的某个位置,您需要按照以下步骤:•
如上面描述到的那样,向目标文档添加一个锚点,生成该文档并将其保存为C1D格式的文档至磁盘。您可以通过预览控件上的Save按钮保存该文档,或者使用文档本身的Save方法通过代码进行保存。
添加一个指向另外一个文档中锚点的链接,这和如何添加一个内部链接的方式很类似。唯一不同的是,除了目标锚点的名称之外,您还必须提供包含该文档的文件名。
这是段完整的程序代码,它将创建一个具有锚点的文档,并保存为磁盘文件(myDocument1.c1d),之后创建另外一个文档,添加一个到第一个文档中的锚点的链接,最后在预览对话框显示第二个文档:
Visual Basic
...
注意以下几点:•
该锚点的创建方式和在同一个文档内部创建链接的方式使用类似的方式。实际上,压根没有任何区别;同一个锚点可以同时作为来自于同一个文档或者不同文档的链接的目标。
为保存此文档,我们使用了Save方法。该方法将文档保存为原生的C1PrintDocument格式,默认的文件扩展名为C1D。按照该格式保存的文件之后可以加载到C1PrintDocument对象以便对其进一步进行处理,或者使用
ComponentOne打印预览控件进行预览。
在创建超链接之前,必须创建一个目标对象,并传递给超链接对象的构造器。从C1LinkTarget基类型派生了若干
不同的链接目标类型。对于外部的锚点,应当使用C1LinkTargetExternalAnchor类型。链接目标包含跳转到该链接所需要的信息,在本示例中,将包含文档所在的文件名以及其中的锚点名称。
添加一个到当前文档某个位置的超链接
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
您可以不创建任何锚点而添加到相同文档的一个链接。此时可以使用通过一个render对象直接创建一个
C1LinkTargetExternalAnchor链接目标,就像下面这样,ro1表示当前文档中任意一个render对象:
Visual Basic
...
preview.Document = doc; preview.ShowDialog();
添加一个到同一个文档中某个页面的超链接
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
可以使用C1LinkTargetPage链接对象添加一个到同一个文档其他页面的超链接,而不需要定义任何锚点。支持以下页面跳转逻辑:
跳转到文档首页。 跳转到文档尾页。
跳转到上一页。 跳转到下一页。
跳转到指定的页码。
从当前页面跳转指定的页数
例如,可以使用以下代码创建一个跳转到文档首页的链接目标:
Visual Basic
...
这里,PageJumpTypeEnum可以指定页面跳转的类型(当然,对于需要指定一个绝对或者相对的页码的跳转命令,您还必须使用接受这些参数的构造器)。
该功能提供在文档自身各个页面之间进行导航的简单方式。例如,您可以向文档页脚添加类似DVD播放器的控件(跳转至首页,跳转至上一页,跳转至下一页,跳转至尾页)。
添加到用户事件的超链接
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
最后您可以在C1PreviewPane上添加一个将触发一个事件的超链接,该事件可以被您的代码逻辑捕获并处理。您应当通过C1LinkTargetUser做到这一点。以下是演示此概念的完整示例代码:
Visual Basic
...
C# |
private void UserLinkSetup() {
// 创建一个具有用户事件超链接的文档. C1PrintDocument doc = new C1PrintDocument(); RenderText rt = new RenderText("Click this to show message box..."); C1LinkTarget linkTarget = new C1LinkTargetUser(); rt.Hyperlink = new C1Hyperlink(linkTarget); rt.Hyperlink.UserData = "My hyperlnk user data"; doc.Body.Children.Add(rt); doc.Generate();
// 创建预览. C1PrintPreviewDialog preview = new C1PrintPreviewDialog();
// 向UserHyperlinkJump事件关联事件处理程序 preview.PreviewPane.UserHyperlinkJump += new HyperlinkEventHandler(PreviewPane_UserHyperlinkJump);
// 预览此文档. preview.Document = doc; preview.ShowDialog(); } private void PreviewPane_UserHyperlinkJump(object sender, HyperlinkEventArgs e) |
...
Class | | | Description |
C1LinkTarget | | | 整个继承关系树的基类。 |
| C1LinkTargetAnchor | | 描述链接目标为当前文档中间的一个锚点。 |
| | C1LinkTargetExternalAnchor | 描述链接目标为另一个文档中间的一个锚点。 |
| C1LinkTargetDocumentLocation | | 描述链接目标为一个render对象。 |
| C1LinkTargetFile | | 描述链接目标为可以被OS Shell打开的外部文件。 |
| C1LinkTargetPage | | 描述链接目标为当前文档的一个页面。 |
| C1LinkTargetUser | | 描述链接目标为一个在C1PreviewPane上调用的用户事件处理函数。 |
| | | |
表达式,脚本,标签
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
表达式(或脚本–这两个术语会在这里交替使用)可以在整个文档的不同的地方使用。通过一对方括号标记一个表达式,如下面的代码所示:
Visual Basic
Visual Basic |
Dim doc As New C1PrintDocument() <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="8353e1ab-d9b7-4847-8c78-e7cf14ebe90a"><ac:plain-text-body><![CDATA[ doc.Body.Children.Add(New RenderText("2 + 2 = [2+2]")) | ]]></ac:plain-text-body></ac:structured-macro> |
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\]" 被解释为一个表达式,并计算出最终的文本。 |
...
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 |
Dim rt As New C1.C1Preview.RenderText() <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="3231ba5c-244f-4f2e-9a1a-3d3e584452d2"><ac:plain-text-body><![CDATA[rt t.Text = "The value of tag1 will appear here: [tag1]." | ]]></ac:plain-text-body></ac:structured-macro> |
C#
C# |
RenderText rt = new RenderText(); <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="0ec3865c-5a80-4a95-92a3-d2f0303339d2"><ac:plain-text-body><![CDATA[rt.Text = "The value of tag1 will appear here: [tag1]."; | ]]></ac:plain-text-body></ac:structured-macro> |
标签/表达式语法
!MISSING PHRASE 'Show All'!
!MISSING PHRASE 'Hide All'!
如果需要,您可以将用来包括标签或者用文本表示的脚本的方括号改成任意字符串,通过文档的 TagOpenParen 以及
TagCloseParen 属性。在您的文档可能包含大量正常方括号字符串时,这种修改能力是一种很好的主意,因为默认情况下,这些方括号将触发表达式解析,即使不影响显示结果,也会消耗大量的资源。所以,您可以这样做:
Visual Basic
Visual Basic |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="05a83531-5f41-443e-a55c-60ea6134ff10"><ac:plain-text-body><![CDATA[ | doc.TagOpenParen = "@@@[" doc.TagCloseParen = "@@@]" | ]]></ac:plain-text-body></ac:structured-macro> |
C#
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#
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#
C# |
C1PrintDocument doc = new C1PrintDocument(); this.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="1ff9be62-ffcf-4678-bfe5-b54049b962e5"><ac:plain-text-body><![CDATA[ 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(); |
]]></ac:plain-text-body></ac:structured-macro> | 当应用程序运行时,以下对话框将在文档生成之前显示:
在任何文本框中改变文本将改变最终生成的文档中实际出现的文本。如果保留默认的文本,将在生成的文档产生以下文字:
Hello World! My name is ComponentOne and I'm currently located in Pittsburgh, PA.
显示特定的标记
!MISSING PHRASE 'Show All'! !MISSING PHRASE 'Hide All'!
当ShowTagsInputDialog属性设置为True时,默认情况下全部的标签将在Tags对话框中显示。您可以通过设置 Tag.ShowInDialog属性防止用户编辑某些特定的标签。为了让用户仅编辑部分标签,在不希望用户编辑的标签上设置标签的Flags属性的值为None。
例如,下面的代码在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("Statement").ShowInDialog = False '将显示创建的标签 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="e65b8ecd-a117-44e3-a64c-6701e588bef4"><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#
C# |
C1PrintDocument doc = new C1PrintDocument(); this.c1PrintPreviewControl1.Document = doc; // 在文档生成时,显示Tags对话框 doc.ShowTagsInputDialog = true; |
...
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 |
|
C#
C# |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } C1PrintDocument doc = new C1PrintDocument(); private void Form1_Load(object sender, EventArgs e) { this.c1PrintPreviewControl1.Document = doc; // 创建将用来显示的标签 <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="496fd9ff-24c4-457e-9500-445c5aabe85d"><ac:plain-text-body><![CDATA[ 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:plain-text-body></ac:structured-macro> <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="f44c5841-8c88-4588-8bea-8d37ba138ad5"><ac:plain-text-body><![CDATA[ C1.C1Preview.RenderText rt = 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="24634eea-5bf9-433d-8309-39159ece3da8"><ac:plain-text-body><! [CDATA[[Location]."; doc.Body.Children.Add(rt); } private void EditTagsNow_Click(object sender, EventArgs e) ]]></ac:plain-text-body></ac:structured-macro>
{ // 在单击按钮时显示Tags对话框 doc.ShowTagsInputDialog = true; doc.EditTags(); } private void GenerateDoc_Click(object sender, EventArgs e) { doc.ShowTagsInputDialog = false; // 单击按钮时生成文档 |
...
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#
C# |
C1PrintDocument doc = new C1PrintDocument(); <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="16674f9b-5dd2-403c-84a9-569b82d42eb1"><ac:plain-text-body><![CDATA[doc.ScriptingOptions.Language = ScriptLanguageEnum.CSharp; RenderText rt = new RenderText("[PageNo == 1 ? \"First\" : \"Not first\"]"); doc.Body.Children.Add(rt); | ]]></ac:plain-text-body></ac:structured-macro> |
程序集和命名空间
!MISSING PHRASE 'Show All'! !MISSING PHRASE 'Hide All'!
默认情况下,下列程序集对脚本可用(引用):
System
System.Drawing
为了添加另一个程序集(系统或自定义)到脚本引用的程序集列表,请将其添加至文档的
C1PrintDocument.ScriptingOptions.ExternalAssemblies集合。例如,以下代码将添加一个到System.Data程序集的引用至文档的脚本:
Visual Basic
...
Visual Basic |
Dim doc As New C1PrintDocument() <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="86414f28-a815-4eac-a39d-ace87bef8ee7"><ac:plain-text-body><![CDATA[ Dim rt As New RenderText("Landscape is " + _ "[Iif(Page.PageSettings.Landscape,\"TRUE\",\"FALSE\")].") doc.Body.Children.Add(rt) | ]]></ac:plain-text-body></ac:structured-macro> |
C#
C# |
C1PrintDocument doc = new C1PrintDocument(); <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="c9d66ecc-7fd4-41cf-b74a-0b05d0cb426b"><ac:plain-text-body><![CDATA[RenderText rt = new RenderText("Landscape is " + "[Iif(Page.PageSettings.Landscape,\"TRUE\",\"FALSE\")]."); doc.Body.Children.Add(rt); | ]]></ac:plain-text-body></ac:structured-macro> |
RenderObject (RenderObject类型)
这个变量引用当前的render对象。例如,下面的代码将打印当前render对象的名称:
Visual Basic
Visual Basic |
Dim doc As New C1PrintDocument() <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="cb2aeb53-c32d-4607-a36a-41f8ae3470c8"><ac:plain-text-body><![CDATA[Dim rt As New RenderText( _ "The object's name is [RenderObject.Name]") rt.Name = "MyRenderText" doc.Body.Children.Add(rt) | ]]></ac:plain-text-body></ac:structured-macro> |
C#
C# |
C1PrintDocument doc = new C1PrintDocument(); <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="aa333f3e-c420-4339-8070-0c0e952669a3"><ac:plain-text-body><![CDATA[RenderText rt = new RenderText( "The object's name is [RenderObject.Name]"); rt.Name = "MyRenderText"; doc.Body.Children.Add(rt); | ]]></ac:plain-text-body></ac:structured-macro> |
Page(C1Page类型)
这个变量引用当前页面(C1Page类型的对象)。而脚本中最常使用的关于页面对象的成员则可以直接访问(参
见下面的PageNo,PageCount等属性),其他数据则可以通过Page变量进行访问,比如当前页面的设置。例如,下面的代码将在当前页面布局是水平方向打印时打印"Landscape is TRUE",否则将打印"Landscape is
FALSE":
Visual Basic
Visual Basic |
Dim doc As New C1PrintDocument() <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="84b4d4e5-1b24-4f36-afc3-d7aa0e5dc163"><ac:plain-text-body><![CDATA[ Dim rt As New RenderText("Landscape is " + _ "[Iif(Page.PageSettings.Landscape,\"TRUE\",\"FALSE\")].") doc.Body.Children.Add(rt) | ]]></ac:plain-text-body></ac:structured-macro> |
C#
C# |
C1PrintDocument doc = new C1PrintDocument(); <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="bf3c8cde-77e1-4958-97df-33c32158087d"><ac:plain-text-body><![CDATA[ RenderText rt = new RenderText("Landscape is " + "[Iif(Page.PageSettings.Landscape,\"TRUE\",\"FALSE\")]."); doc.Body.Children.Add(rt); | ]]></ac:plain-text-body></ac:structured-macro> |
PageNo(整数类型)
此名称解析为从1开始计数的页码。相当于 Page.PageNo。
PageCount(整数类型)
此名称解析为文档的总页数。相当于Page.PageCount。例如,下面的代码可以用于产生通用的"第X页,共Y 页"的页眉:
Visual Basic
Visual Basic |
Dim doc As New C1PrintDocument() doc.PageLayout.PageHeader = New RenderText( _ <ac:structured-macro ac:name= "unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="e2b19e6b-aae9-4757-a923-b934cbea81c6"><ac:plain-text-body><![CDATA[ "Page [PageNo] of [PageCount]") | ]]></ac:plain-text-body></ac:structured-macro> |
C#
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#
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#
C# |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="cdd5027c-a7c4-4390-82cc-cf507335e258"><ac:plain-text-body><![CDATA[ | rt.Text = "[Fields(\"ProductName\").Value]"; | ]]></ac:plain-text-body></ac:structured-macro> |
但使用"!"符号更短更容易阅读。
Aggregates (AggregateCollection类型)
这个变量来访问的文档中定义的汇总的集合。集合的类型为C1.C1Preview.DataBinding.AggregateCollection,其中的元素类型为C1.C1Preview.DataBinding.Aggregate。例如,下面的代码将在产品的列表后打印平均单价:
Visual Basic
Visual Basic | <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="5771a2ad-457e-40b8-86c0-7d7d90ad9959"><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() 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( _ ]]></ac:plain-text-body></ac:structured-macro> <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="b9bd94c7-33be-4a2c-a6ca-cbaaedd08d4e"><ac:plain-text-body><![CDATA[ "Average price: [Aggregates!AveragePrice.Value]")) | ]]></ac:plain-text-body></ac:structured-macro> |
C#
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#
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, |
...
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> |
数据绑定示例
数据绑定示例,位于HelpCentral,包含几个数据绑定文档的示例。以下主题将讨论这些示例其中的一些问题。
使用分组
!MISSING PHRASE 'Show All'! !MISSING PHRASE 'Hide All'!
一个典型的应用分组的示例由以下代码进行演示:
Visual Basic
Visual Basic |
' 创建一个按照分组重复的RenderArea. Dim ra As C1.C1Preview.RenderArea = New C1.C1Preview.RenderArea ra.Style.Borders.All = New C1.C1Preview.LineDef("2mm", Color.Blue)
' MyData 对象数组用作数据源: ra.DataBinding.DataSource = MyData.Generate(100, 0)
' 数据按照GroupId字段进行分组: |
ra.DataBinding.Grouping.Expressions.Add("Fields!GroupId.Value")
' 创建一个做为分组页眉的RenderText;通常情况下,页眉可以非常复杂,其本身可以是数据绑定的: Dim rt As C1.C1Preview.RenderText = New C1.C1Preview.RenderText
' 分组页眉看起来像是"GroupId=XXX"的格式,这里XXX表示分组中GroupId字段的值: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="c8cccb01-09d9-4b0c-bc95-eaab0885c763"><ac:plain-text-body><![CDATA[ rt.Text = "GroupId: [Fields!GroupId.Value]" rt.Style.BackColor = Color.Yellow ]]></ac:plain-text-body></ac:structured-macro>
' 为分组区域添加标题: ra.Children.Add(rt)
'该 RenderText 将会在每一个分组打印一条记录: rt = New C1.C1Preview.RenderText
' 为每一条记录打印的文本: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="0d74d1c2-9660-4aa1-99d5-6867625ae7be"><ac:plain-text-body><![CDATA[ rt.Text = "GroupId: [Fields!GroupId.Value]" & Microsoft.VisualBasic.Chr(13) & ]]></ac:plain-text-body></ac:structured-macro> <ac:structured-macro ac:name= "unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="85a01852-d6a4-466e-a698-2b17780acfe7"><ac:plain-text-body><![CDATA["IntValue: [Fields!IntValue.Value]" rt.Style.Borders.Bottom = C1.C1Preview.LineDef.Default rt.Style.BackColor = Color.FromArgb(200, 210, 220) ]]></ac:plain-text-body></ac:structured-macro> '设置该文本的数据源为其所包含的RenderArea的数据源,这表示该render对象绑定到当前分组的特定对象上: rt.DataBinding.DataSource = ra.DataBinding.DataSource
' 向区域添加文本: ra.Children.Add(rt) |
...
C# |
// 创建一个按照分组重复的RenderArea. RenderArea ra = new RenderArea(); ra.Style.Borders.All = new LineDef("2mm", Color.Blue);
// MyData 对象数组用作数据源: ra.DataBinding.DataSource = MyData.Generate(100, 0);
// 数据按照GroupId字段进行分组: ra.DataBinding.Grouping.Expressions.Add("Fields!GroupId.Value");
// 创建一个做为分组页眉的RenderText;通常情况下,页眉可以非常复杂,其本身可以是数据绑定的: RenderText rt = new RenderText();
// 分组页眉看起来像是"GroupId=XXX"的格式,这里XXX表示分组中GroupId字段的值: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="95fce11a-454f-466d-8311-94a3e39f2ef4"><ac:plain-text-body><![CDATA[ rt.Text = "GroupId: [Fields!GroupId.Value]"; rt.Style.BackColor = Color.Yellow; ]]></ac:plain-text-body></ ac:structured-macro> // 为分组区域添加标题: ra.Children.Add(rt);
//该 RenderText 将会在每一个分组打印一条记录: |
rt = new RenderText();
// 为每一条记录打印的文本: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="d19015a1-a289-4986-86f1-f3a777be54c6"><ac:plain-text-body><![CDATA[ rt.Text = "GroupId: [Fields!GroupId.Value]\rIntValue: [Fields!IntValue.Value]"; rt.Style.Borders.Bottom = LineDef.Default; rt.Style.BackColor = Color.FromArgb(200, 210, 220); ]]>< /ac:plain-text-body></ ac:structured-macro> // 设置该文本的数据源为其所包含的RenderArea的数据源,这表示该render对象绑定到当前分组的特定对象上: rt.DataBinding.DataSource = ra.DataBinding.DataSource;
// 向区域添加文本: ra.Children.Add(rt); |
使用汇总功能
!MISSING PHRASE 'Show All'! !MISSING PHRASE 'Hide All'!
以下代码扩展了之前的示例,介绍了为文档和分组使用汇总功能,该示例将和之前的代码做为一个整体:
Visual Basic
Visual Basic |
' 创建一个对每一个分组重复的Render区域: Dim ra As C1.C1Preview.RenderArea = New C1.C1Preview.RenderArea ra.Style.Borders.All = New C1.C1Preview.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 each group: Dim agg As C1.C1Preview.DataBinding.Aggregate = New C1.C1Preview.DataBinding.Aggregate("Group_IntValue")
' 定义计算求和的表达式: agg.ExpressionText = "Fields!IntValue.Value"
' 指定该汇总操作应当针对当前分组范围: agg.Running = C1.C1Preview.DataBinding.RunningEnum.Group
' 指定汇总操作的数据源: agg.DataBinding = ra.DataBinding
''添加汇总至文档: doc.DataSchema.Aggregates.Add(agg)
' 创建一个用于计算每一个分组中IntValue字段之和的汇总calc the sum of IntValue fields over the whole document: agg = New C1.C1Preview.DataBinding.Aggregate("Total_IntValue")
' 定义用作计算求和的表达式: |
agg.ExpressionText = "Fields!IntValue.Value" ' Specify that aggregate should have document scope: agg.Running = C1.C1Preview.DataBinding.RunningEnum.All
' 指定汇总操作的数据源: agg.DataBinding = ra.DataBinding
''添加汇总至文档: doc.DataSchema.Aggregates.Add(agg)
' 添加分组页眉: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="50527189-4563-4d30-837a-dabd3e5f9d18"><ac:plain-text-body><![CDATA[ Dim rt As C1.C1Preview.RenderText = New C1.C1Preview.RenderText rt.Text = "GroupId: [Fields!GroupId.Value]" rt.Style.BackColor = Color.Yellow ra.Children.Add(rt) ]]></ac:plain-text-body></ac:structured-macro>
' 该呈现文本将打印分组记录;和可以看到的那样,分组汇总的值不仅仅可以在分组页脚中引用,也可以在分组页眉和分组内容区域引用 <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="181bd4a6-1d69-4bfc-84eb-fcfafc6b221f"><ac:plain-text-body><![CDATA[ rt = New C1.C1Preview.RenderText rt.Text = "GroupId: [Fields!GroupId.Value]\rIntValue:[Fields!IntValue.Value]\rGroup_IntValue: ]]></ac:plain-text-body></ac:structured-macro> <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="677a87bc-d7d6-4f42-8c8a-0b6a5796df68"><ac:plain-text-body><! [CDATA[[Aggregates!Group_IntValue.Value]\rTotal_IntValue: ]]></ac:plain-text-body></ac:structured-macro> <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="a2231846-fc7d-4741-a139-1b69471e47c4"><ac:plain-text-body><! [CDATA[[Aggregates!Total_IntValue.Value]\rTatalNested_IntValue: [Aggregates!TatalNested_IntValue.Value]" ]]></ac:plain-text-body></ac:structured-macro>
rt.Style.Borders.Bottom = C1.C1Preview.LineDef.Default rt.Style.BackColor = Color.FromArgb(200, 210, 220) rt.DataBinding.DataSource = ra.DataBinding.DataSource ra.Children.Add(rt)
' 该汇总也在分组内进行计算,但是关联到内嵌对象的数据绑定: agg = New C1.C1Preview.DataBinding.Aggregate("TotalNested_IntValue") agg.ExpressionText = "Fields!IntValue.Value" agg.Running = RunningEnum.All agg.DataBinding = rt.DataBinding doc.DataSchema.Aggregates.Add(agg)
' 添加该区域至文档: doc.Body.Children.Add(ra) |
...
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> |
C#
C# |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="aa34e5b2-b5f5-4bb9-badd-c0542bce0f7f"><ac:plain-text-body><![CDATA[ | RenderText rt = new RenderText("[Sum(\"Fields!Balance.Value\")]"); | ]]></ac:plain-text-body></ac:structured-macro> |
以下新的属性和方法被添加到DataSet和C1DataBinding类型上以支持此功能:
...
Visual Basic |
Dim doc As New C1PrintDocument() Dim raGroupId As New RenderArea() ' 按照需求设置raGroupId的属性... raGroupID.DataBinding.DataSource = dataSet raGroupID.DataBinding.Name = "GroupID" raGroupID.DataBinding.Grouping.Expressions.Add("Fields!GroupID.Value") Dim raSubGroupID As New RenderArea() ' 按照需求设置raSubGroupID的属性... raSubGroupID.DataBinding.DataSource = dataSet raSubGroupID.DataBinding.Grouping.Expressions.Add("Fields!SubGroupID.Value") raGroupID.Children.Add(raSubGroupID) Dim raDetail As New RenderArea() ' 按照需求设置raDetail属性... raDetail.DataBinding.DataSource = dataSet raSubGroupID.Children.Add(raDetail)
' 显示 Q 字段的值: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="2a0f65e8-45e6-447b-87c7-7a9173e3f3f5"><ac:plain-text-body><![CDATA[ Dim rtQ As New RenderText() rtQ.Text = "[Fields!Q.Value]" raDetail.Children.Add(rtQ) ]]></ac:plain-text-body></ac:structured-macro>
' 显示内嵌分组 Q 字段的值之和(SubGroupID) <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="967be246-e492-4019-b384-784bc257a71f"><ac:plain-text-body><![CDATA[ Dim rtSumQ1 As New RenderText() rtSumQ1.Text = "[Sum(""Fields!Q.Value"")]" raDetail.Children.Add(rtSumQ1) ]]></ac:plain-text-body></ac:structured-macro>
' 显示GroupID的所有Q字段的值之和: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="ca98405b-fc0b-4313-b7e5-ea1de229aa89"><ac:plain-text-body><![CDATA[Dim rtSumQ2 As New RenderText() rtSumQ2.Text = "[Sum(\"Fields!Q.Value\", "\"GroupID\"")]" raDetail.Children.Add(rtSumQ2) ]]></ac:plain-text-body></ac:structured-macro>
' 显示整个数据集Q字段的值之和: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="bd3dbead-022e-46f3-b69e-15642a93206a"><ac:plain-text-body><![CDATA[ Dim rtSumQ3 As New RenderText() rtSumQ3.Text = "[Sum(\"Fields!Q.Value\", "\"DataSet\"")]" raDetail.Children.Add(rtSumQ3) doc.Body.Children.Add(raGroupId) | ]]></ac:plain-text-body></ac:structured-macro> |
C#
C# |
C1PrintDocument doc = new C1PrintDocument(); RenderArea raGroupId = new RenderArea(); // 按照需求设置raGroupId的属性... raGroupID.DataBinding.DataSource = dataSet; raGroupID.DataBinding.Name = "GroupID"; raGroupID.DataBinding.Grouping.Expressions.Add("Fields!GroupID.Value"); RenderArea raSubGroupID = new RenderArea(); |
// 按照需求设置raSubGroupID的属性... raSubGroupID.DataBinding.DataSource = dataSet; raSubGroupID.DataBinding.Grouping.Expressions.Add("Fields!SubGroupID.Value"); raGroupID.Children.Add(raSubGroupID); RenderArea raDetail = new RenderArea(); // 按照需求设置raDetail属性... raDetail.DataBinding.DataSource = dataSet; raSubGroupID.Children.Add(raDetail);
// 显示 Q 字段的值: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="5e06c491-aa4f-4ce2-b6d5-471c5036fd4a"><ac:plain-text-body><![CDATA[ RenderText rtQ = new RenderText(); rtQ.Text = "[Fields!Q.Value]"; raDetail.Children.Add(rtQ); ]]>< /ac:plain-text-body></ ac:structured-macro> // 显示内嵌分组 Q 字段的值之和(SubGroupID) <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="2ac10ffb-e17e-4d82-8e4a-0e296f8e82bb"><ac:plain-text-body><![CDATA[ RenderText rtSumQ1 = new RenderText(); rtSumQ1.Text = "[Sum(\"Fields!Q.Value\")]"; raDetail.Children.Add(rtSumQ1); ]]>< /ac:plain-text-body></ ac:structured-macro> // 显示GroupID的所有Q字段的值之和: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="cf967af6-7289-4a02-85de-8c2b5aed25ee"><ac:plain-text-body><![CDATA[RenderText rtSumQ2 = new RenderText(); rtSumQ2.Text = "[Sum(\"Fields!Q.Value\", "\"GroupID\"")]"; raDetail.Children.Add(rtSumQ2); ]]>< /ac:plain-text-body></ ac:structured-macro> // 显示整个数据集Q字段的值之和: <ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="799d5d31-3288-4127-be5e-bad7d256d046"><ac:plain-text-body><![CDATA[ RenderText rtSumQ3 = new RenderText(); rtSumQ3.Text = "[Sum(\"Fields!Q.Value\", "\"DataSet\"")]"; raDetail.Children.Add(rtSumQ3); doc.Body.Children.Add(raGroupId); | ]]></ac:plain-text-body></ac:structured-macro> |
当以上文档生成时,每一个raDetail分组的实例将显示以下四个值:
"Q"字段的当前值 位于当前SubGroupID中间的"Q"字段的值之和 位于当前GroupID中的"Q"字段的值之和 整个文档的"Q"值之和目录
C1PrintDocument支持自动生成目录(TOC)。目录本身由专门的render对象呈现,类型为RenderToc,该类型派生自RenderArea 类型并增加了TOC相关的功能。TOC中间每一个单独的项目由 RenderTocItem表示(继承
自RenderParagraph)。每一个TOC项目有一个超链接( RenderTocItem.Hyperlink 属性),指向文档中的一个位置
(由锚点表示)。因此,用于连接TOC项目和文档内容的机制和超链接一致。提供了方便的创建TOC的方法,详见下文。
为了向文档添加一个目录,请执行以下步骤:
...