FOXTABLE编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据绑定
最简单的绑定
首先还是打开我们的示例文件“专业报表.Table”,然后在命令窗口执行下面的代码:
Dim doc As New PrintDoc
Dim rt As New prt.RenderText
rt.DataBinding.DataSource = BindTables("订单") '将rt绑定到订单表
rt.Text= "[Fields!产品.Value]" '设置打印字段
doc.body.Children.Add(rt)
doc.Preview()
上述代码会打印出订单表中每一行的产品名称。
DataBinding用于设置打印对象的绑定属性,该属性包括一些子属性,DataSource表示数据来源,数据来源可以是Table,还可以是数组或者集合。
需要注意的是,不能直接绑定到Table,如果要绑定到Table,必须用BindTables来设置,例如:
rt.DataBinding.DataSource = BindTables("订单")
如果对象的内容来自于某一列,其Text属性的设置格式如下:
[Fields!列名称.Value]
使用表达式
在命令窗口执行下面的代码:
Dim doc As New PrintDoc
Dim rt As New prt.RenderText
rt.DataBinding.DataSource = BindTables("订单") '将rt绑定到订单表
rt.Text= "[Math.Round(Fields!金额.Value,1)]" '设置打印表达式
doc.body.Children.Add(rt)
doc.Preview()
留意方括号中的内容:
Math.Round(Fields!金额.Value,1)
意思是打印的时候将金额列的内容,保留一位小数,你可以在Text属性中使用Foxtable 支持的所有函数。
注意表达式必须用方括号括起来。
日期的打印
为了得到常规的日期格式,可以利用Format格式化日期数据:
Dim doc As New PrintDoc
Dim rt As New prt.RenderText
rt.DataBinding.DataSource = BindTables("订单") '将rt绑定到订单表
rt.Text= "[Format(Fields!日期.Value,""yyyy-MM-dd"")]"
doc.body.Children.Add(rt)
doc.Preview()
要记得对于字符串中的每一个双引号,都必须用两个双引号来表示。
在命令窗口执行下面的代码:
绑定多个字段
为了打印出订单表中的日期和数量,在命令窗口执行下面的代码:
需要使用容器(RenderArea),将原来的打印对象加入到容器中,这些打印对象不再需要设置绑定,只需为容器设置绑定即可。
例如:
Dim doc As New PrintDoc
Dim rt As New prt.RenderText
Dim ra As New prt.RenderArea
ra.Style.Spacing.Bottom = 2
ra.DataBinding.DataSource = BindTables("订单") '将容器绑定到订单表
rt.Text = "[Fields!日期.Value]"
ra.Children.Add(rt) '将打印对象添加到容器中
rt = New prt.RenderText
rt.Text= "[Fields!数量.Value]"
ra.Children.Add(rt)
doc.body.Children.Add(ra)
doc.Preview()
上述的代码将依次打印每一个订单的日期和数量。
打印标签
有了绑定,打印标签比以前更简单。
示例
Dim doc As New PrintDoc '定义一个报表
Doc.Stacking = prt.StackingRulesEnum.InlineLeftToRight
Dim ra As New prt.RenderArea
Dim rt As prt.RenderText
ra.Width = 40 '设置标签宽度
ra.SplitHorzBehavior = prt.SplitBehaviorEnum.Never '禁止水平分割
ra.SplitVertBehavior = prt.SplitBehaviorEnum.Never '禁止垂直分割
ra.Style.Spacing.Right = 2 '设置标签之间的所有和上下间隔为2毫米
ra.Style.Spacing.Bottom = 2
ra.Style.Padding.All = 1 ' 标签内容距离边框为1毫米
ra.Style.Borders.All = New prt.Linedef(0.3, Color.Red) '设置边框
ra.DataBinding.DataSource = BindTables("员工") '将容器绑定到员工表
Doc.Body.ChildRen.Add(ra) '将容器加入到报表中
rt = New prt.RenderText
rt.Text = "姓名:[Fields!姓名.Value]"
ra.Children.Add(rt) '添加到容器中
rt = New prt.RenderText
rt.Text = "部门:[Fields!部门.Value]"
ra.Children.Add(rt) '添加到容器中
rt = New prt.RenderText
rt.Text = "职务:[Fields!职务.Value]"
ra.Children.Add(rt) '添加到容器中
Doc.Preview() '预览报表
表格与绑定
行组也可以设置绑定,这样我们可以很方便地将一个表格绑定到数据表。
例如,打印订单表中的某些列,代码非常简单:
Dim doc As New PrintDoc
Dim rt As New prt.RenderTable
Dim tb as Table = Tables("订单")
Dim ColNames As String() = New String(){"产品", "客户","单价", "数量", "金额"} For c As integer = 0 To ColNames.Length -1
rt.Cells(0,c).Text = ColNames(c)
rt.Cols(c).Width = tb.Cols(ColNames(c)).PrintWidth
rt.Cells(1, c).Text = "[Fields!" & ColNames(c) & ".Value]" '设置绑定表达式
Next
rt.RowGroups(0,1).Style.TextAlignVert = prt.AlignVertEnum.Center '第一行内容垂直居中
rt.RowGroups(0,1).Header = prt.TableHeaderEnum.All '将第一行作为表头。
rt.RowGroups(1,1).DataBinding.DataSource = BindTables("订单") '将第二行绑定到订单表
doc.Body.Children.Add(rt)
doc.Preview()
注意这一行代码:
rt.RowGroups(1,1).DataBinding.DataSource = BindTables("订单") '将第二行绑定到订单表
该行代码将表格的第二行绑定到订单表,这样第二行将根据订单表中的每一行数据,自动生成副本,完成整个表格的打印。
FOXtable编程基本概念
DataTable和Table
Foxtable中有一个集合DataTables,通过该集合可以获得指定名称的表,例如:DataTables("产品") '产品表
DataTables("客户") '客户表
DataTables("订单") '订单表
实际上你是看不到DataTable的,你看到的是Table,也就是说,上面的三个图,实际上就是三个Table。
那么什么是Table呢?你可以这样理解,DataTable就像一个仓库,所有从数据文件中加载
的数据,都存放在这里,而且这个仓库是不直接面对用户的;而Table就像一个展厅,是负责和用户打交道的,这个展厅(Table)从仓库(DataTable)中取得数据,并呈现给用户。
同样,Foxtable中也有一个集合Tables,通过该集合可以获得指定名称的Table,在没有建立关联的情况下,我们这个简化的订单管理系统包括三个Table,分别是:
Tables("产品")
Tables("客户")
Tables("订单")
在初始的情况下,Table会从DataTable中提取所有数据呈现给用户,如果你设置了筛选条件,Table就会从DataTable提取符合筛选条件的数据,然后呈现给用户。
例如订单表有1000行数据,那么DataTables("订单")从头到尾,始终都会有1000行数据,不受筛选的影响。
而Tables("订单")却不一样,如果没有进行筛选,那么Tables("订单")也会包括所有数据,也就是1000行数据全部可见。
如果现在从中筛选出产品为PD01的订单,且PD01的订单是200个,那么经过筛选后,Tables("订单")会包括200行数据,也就是你看到的那200个产品为PD01的订单。
所以关于DataTable和Table的关系,较为完整的描述是:
从数据文件加载到Foxtable中的数据,是存放在DataTable中的,它就像一个仓库,不直接面对用户;而Table就像一个展厅,是负责和用户打交道的,它根据指令从仓库(DataTable)中提取符合条件的数据,然后呈现给用户;通过菜单进行的日常数据管理工作,例如增加行、删除行、排序、筛选、汇总等等,都是在Table中进行的;除了编程,用户没有办法直接对DataTable进行操作,因为它是不可见的。
在任何时候,DataTable都包括所有已经加载的行。
Table中的行,既可以排序,也可以筛选,所有Table中行的数量和顺序都是可变化的,我们平时所看到的、所操作的,都是Table中的行。
我们在Table中进行的任何操作,最终都会反映到DataTable,例如我们通过菜单在Table 中删除行,DataTable也会删除一行。
关联表和Table
定在上面这个简化的订单管理系统中,我们建立如下两个关联:
因为关联的建立,DataTable和Table不再是一一对应的关系,例如我选择产品表的时候,就会出现三个Table,分别是:
三个Table的作用为:
Tables("产品"):主表,用于显示所有产品
Tables("产品.订单"):如果在Tables("产品")中选定一个产品,这里会显示该产品的全部订单。
Tables("产品.订单.客户"):如果在Tables("产品.订单")中选定一个订单,这里会显示该订单所属的客户。
同样在选择客户表的时候,也会出现三个Table:
Tables("客户")
Tables("客户.订单")
Tables("客户.订单.产品")
而选择订单表,出现的三个Table为:
Tables("订单")
Tables("订单.产品")
Tables("订单.客户")
由此我们可以看出,同一个DataTable可以有多个Table,例如下面三个Table:
Tables("产品")
Tables("订单.产品")
Tables("客户.订单.产品")
它们的数据全部来自于DataTables("产品")。
由此可见,DataTable的数量是固定的,而Table的数量会随着关联的增加而增加,同一个DataTable可以有多个Table,每个Table都各取所需地从DataTable中提取数据呈现给用户。
DataTable概述
通过DataTables集合,可以获得指定名称的DataTable(表)。
例如:
Dim dt As DataTable
dt = DataTables("订单")
DataCol表示DataTable中的列。
通过DataCols集合,可以获得指定名称的DataCol(列)。
例如:
Dim dt As DataTable = DataTables("订单")
Dim dc As DataCol = dt.DataCols("日期")
DataRow表示DataTable中的行。
通过DataRows集合,可以获得某一位置的DataRow(行)。
例如:
Dim dr As DataRow
dr = DataTables("订单").DataRows(0)
行是从0开始编号的,所以0表示第一行,1表示第二行。
通过列名称,我们可以得到或设置某一行指定列的内容。
例如:
Dim r As DataRow
Dim v As Double
r = DataTables("订单").DataRows(0)
r("数量") = 100
v = r("折扣")
由此可知,DataTable、DataRow、DataCol构成了表、行、列这样一个完整的结构体系,接下来我们具体介绍这三个对象。
DataTable常用属性
通过DataTables集合,可以获得指定名称的DataTable(表)。
例如:
Dim dt As DataTable
dt = DataTables("订单")
如果要禁止编辑某个DataTable,只需将其AllowEdit属性设为False,例如:DataTables("订单").AllowEdit = False
在命令窗口执行上述代码,你会发现订单表的左上角出现一个锁形标记,表示此表已经被锁定,不能在其中输入数据。
如果你要取消锁定表,只需将其AllowEdit属性重新设为True:
DataTables("订单").AllowEdit = True
下表列出了DataTable的常用设置属性,它们的用法和AllowEdit属性完全一样:
例如你希望按回车键向下移动光标,而不是向右移动,只需将EnterKeyActionDown属性设为True即可:
DataTables("订单").EnterKeyActionDown = True
最后三个常用的属性为:
例如执行下面的代码,将列出所有已经修改过的DataTable:
Output.Show("已经修改的数据表:")
For Each dt As DataTable In DataTables
If dt.Type = 1 Orelse dt.Type = 3 Then
If dt.HasChanges Then
Output.Show()
End If
End If
Next
DataTable常用方法
AddNew
在DataTable中增加一行或多行,并返回所增加的第一行。
AddNew()
AddNew(Count)
Count: 可选参数,要增加的行数,如果省略,则只增加一行。
例如:
Dim dr As DataRow
dr = DataTables("订单").AddNew()
dr("日期") = Date.Today '将新增行的日期设为当天日期。
其实我们很少直接向DataTable增加行,更多的时候,我们是向Table中增加行,原因以后会讲述。
Save
保存数据。
语法:
Save()
Save(Setting)
Setting: 可选参数,是否保存设置。
例如单单保存数据:
DataTables("订单").Save()
同时保存数据和设置:
DataTables("订单").Save(True)
保存设置比较耗时,会影响保存速度。
菜单中的保存命令是同时保存数据和设置的。
如果你学会了设计菜单或窗口,你可以自己设计一个保存按钮,将其代码设为:
For Each dt As DataTable In DataTables
dt.Save()
Next
这样单击这个按钮就能保存所有表,但是不会保存设置;对于一个成熟的、已经交付使用的项目,有时是没有必要保存设置的。
GetValues
从指定列中,获取不重复的值,以集合的形式返回。
语法:
GetValues(ColumnName,Filter,Sort)
ColumnName:列名称,从此列中提取不重复的值。
Filter: 可选参数,指定一个条件表达式,只返回符合此条件的值;请参考表达式的运算符和函数和条件表达式
Sort: 可选参数,指定排序列,如果省略,则根据取值列排序,通常无需设置。
示例一
列出产品表中所有的产品名称:
Dim Products As List(Of String)
Products = DataTables("产品").GetValues("产品名称")
For Each Product As String In Products
Output.Show(Product)
Next
示例二
返回的值默认按照取值列排序,我们可以另外指定排序列;例如按产品编号顺序,列出产品表中所有的产品名称:
Dim Products As List(Of String)
Products = DataTables("产品").GetValues("产品名称","","产品编号")
For Each Product As String In Products
Output.Show(Product)
Next
示例三
给排序列加上DESC关键词,返回值可以降序排序,例如按最近一次订货的日期顺序,列出订单表中的客户名单:
Dim Customers As List(Of String)
Customers = DataTables("订单").GetValues("客户","","日期 Desc")
For Each Customer As String In Customers
Output.Show(Customer)
Next
示例四
可以设置取值条件,列出产品表中单价大于100的产品:
Dim Products As List(Of String)
Products = DataTables("产品").GetValues("产品名称","单价 > 100")
For Each Product As String In Products
Output.Show(Product)
Next
示例五
可以同时设置取值条件和排序列,例如按日期顺序,列出2012年6月1日后订购过PD01产品的客户名单:
Dim Customers As List(Of String)
Customers = DataTables("订单").GetValues("客户","[产品]= 'PD01' And [日期] >
#6/1/2012#","日期")
For Each Customer As String In Customers
Output.Show(Customer)
Next
示例六
下面这个例子,一般用户客户忽略。
可以同时从多列提取不重复的值,此时返回的不是字符的集合,而是字符数组的集合。
例如从客户列和产品列提取不重复的值:
'定义数组集合的时候,要在类型后加上括号,表示这是一个数组集合。
Dim Arys As List(Of String())
Arys = DataTables("订单").GetValues("产品|客户") '列名用符号|分割
'注意循环变量是字符型数组,所以类型是String(),而不是String
For Each Ary As String() In Arys
Output.Show(Ary(0) & "|" & Ary(1))
Next
上面的代码是从客户和产品两列提取不重复的值,返回的不是一个字符集合,而是一个字符数组集合,每个数组包括两个元素,第一个元素是客户值,第二个元素是产品值。
GetComboListString
从指定的列中提取不重复的值,用符号"|"将这些值连接成一个字符串,并返回这个字符串。
此方法通常用于动态设置列表项目。
语法:
GetComboListString(ColumnName,Filter, Sort)
ColumnName:列名称,从此列中提取不重复的值。
Filter: 可选参数,指定一个条件表达式,只返回符合此条件的值。
Sort: 可选参数,指定排序列,如果省略,则根据取值列排序,通常无需设置。
请参考表达式的运算符和函数和条件表达式
示例一
列出订单表所有的客户:
Dim s As String = DataTables("订单").GetComboListString("客户")
output.show(s)
示例二
返回的值默认按取值列排序,可以另外指定排序列,例如按产品编号顺序,列出产品表中所有的产品名称:
Dim s As String = DataTables("产品").GetComboListString("产品名称","","产品编号")
output.show(s)
示例三
可以给排序列加上关键词,例如按最近一次订货的日期顺序,列出订单表中的客户名单:Dim s As String = DataTables("订单").GetComboListString("客户","","日期 Desc") Output.Show(s)
实例四
可以设置取值条件,例如从客户表中提取华北地区的客户名单:
Dim s As String
s = DataTables("客户").GetComboListString("客户名称","[地区] = '华北'") Output.Show(s)
示例五
可以同时设置取值条件和排序列,例如按日期顺序,列出2012年6月1日后订购过PD01产品的客户名单:
Dim s As String
s = DataTables("订单").GetComboListString("客户","[产品]= 'PD01' And [日期] > #6/1/2012#","日期")
Output.Show(s)
Compute
根据条件统计表中数据。
语法:
Compute(Expression, Filter)
Expression: 要计算的表达式,使用聚合函数进行统计。
Filter:可选参数,用于设置计算条件,请参考表达式的运算符和函数和条件表达式。
在执行以下示例之前,请打开CaseStudy目录下的示例文件"统计演示.Table"。
示例一
计算总的销售数量和金额:
Dim Total As Integer
Dim Amount As Double
With DataTables("订单")
Total = .Compute("Sum(数量)")
Amount = .Compute("Sum(金额)")
End With
Output.Show("数量:" & Total)
Output.Show("金额:" & Amount)
示例二
计算产品PD01的销售数量:
Dim Total As Long
Total = DataTables("订单").Compute("Sum(数量)", "产品 = 'PD01'")
Output.Show(Total)
实例三
统计雇员EP01成交的订购数量超过500的订单数:
Dim cnt As Integer
cnt = DataTables("订单").Compute("Count([客户])", "雇员 = 'EP01' And 数量 > 500") Output.Show("订单数:" & cnt)
示例四
计算每个客户的订购数量:
Dim dt As DataTable = DataTables("订单")
Dim Total As Integer
Dim Customers As List(Of String)
Customers = dt.GetValues("客户")
For Each Customer As String In Customers
Total = pute("Sum(数量)", "[客户] = '" & Customer & "'")
Output.Show(Customer & ":" & Total)
Next
上述代码中,Filter参数分成了三部分,各部分用运算符&连接起来:
"[客户] = '" & Customer & "'"
如果客户名称为CS01,那么三部分组合后,Filter参数就等于:
"[客户] = 'CS01'"
通过代码动态合成条件表达式,是一种基本的技能,大家务必要掌握。
参考:GetValues
Find
在DataTable查找符合条件的行,如果找到的话,返回找到的行,否则返回Nothing。
如果有多个符合条件的行,默认返回第一个,也可以指定返回第几个符合条件的行。
语法:
Find(Filter,Sort,Index)
Filter: 条件表达式,请参考表达式的运算符和函数和条件表达式。
Sort: 可选参数,指定排序方式。
Index: 可选参数,指定返回第几个符合条件的行,0表示第一行。
示例一:
Dim dr As DataRow
dr = DataTables("产品").Find("产品编号 = '03'") '找出编号为03的产品
With DataTables("订单")
dr = .Find("产品 = 'PD01'","日期") '找出第一次订购PD01产品的记录
dr = .Find("产品 = 'PD01'","日期",1) '找出第二次订购PD01产品的记录
End With
示例二:
有的时候,我们需要查找倒数第几行数据,例如最近一次订购某产品的记录。
可以参考下面的代码:
Dim dr As DataRow
With DataTables("订单")
dr = .Find("产品 = 'PD01'","日期 Desc") '找出最后一次订购PD01产品的记录 dr = .Find("产品 = 'PD01'","日期 Desc",1) '找出倒数第二次订购PD01产品的记录
End With
可以看到代码和原来几乎一样,唯一的变化是排序参数,被改为:日期 Desc
加上DESC使得日期按照降序排序,最后的日期排在最前面,我们所找出的第一条记录,就是最后一次订购产品PD01的记录。
示例三
通常应该在代码中判断是否找到了符合条件的行,然后再运行后续的代码。
例如要找出最近一次订购产品数量超过1000的订单,并显示订单的日期和客户:
Dim dr As DataRow
dr = DataTables("订单").Find("数量 > 1000","日期 Desc")
If dr IsNot Nothing Then '如果找到的话
Output.Show("日期:" & dr("日期"))
Output.Show("客户:" & dr("客户"))
End If
如果我们不加上判断,直接:
Dim dr As DataRow
dr = DataTables("订单").Find("数量 > 1000","日期 Desc")
Output.Show("日期:" & dr("日期"))
Output.Show("客户:" & dr("客户"))
一旦订单表并不存在订购数量超过1000的订单,那么Find方法返回Nothing,导致后续代码运行出错。
Find函数只能找出一条符合条件的行,如果要同时找出所有符合条件的行,可以使用Select 方法。
Select
以集合的形式,返回所有符合指定条件的行。
语法:
Select(Filter)
Select(Filter,Sort)
Filter: 条件表达式,请参考表达式的运算符和函数和条件表达式。
Sort: 可选参数,指定排序方式
我们经常需要对符合某一条件的记录,统一进行处理,此时Select方法就派上用场了。
示例一
例如,对于1999年1月4日订购PD01的订单,希望将其折扣统一设置为0.12,代码为:Dim drs As List(Of DataRow)
drs = DataTables("订单").Select("[产品] = 'PD01' And [日期]= #1/4/1999#")
For Each dr As Datarow In drs
dr("折扣") = 0.12
Next
示例二
再例如,希望列出1999年1月4日订购PD01的客户,按订购的数量排序:
Dim drs As List(Of DataRow)
drs = DataTables("订单").Select("[产品] = 'PD01' And [日期]= #1/4/1999#","数量DESC")
For Each dr As Datarow In drs
Output.show(dr("客户"))
Next
上面的代码将Sort参数设置为“数量 DESC”,这样返回的行不仅按数量排序,而且数量多的行排在前面。
示例三
Filter参数不能省略,如果希望返回所有行,将Filter参数设置为""即可。
例如希望按总分高低,依次显示所有学生的姓名:
For Each dr As DataRow In DataTables("成绩表").Select("","总分 DESC") Output.Show(dr("姓名"))
Next
DeleteFor
删除符合条件的行。
语法:
DeleteFor(Filter)
Filter: 一个表达式,用于指定删除条件,请参考表达式的运算符和函数和条件表达式例如:
删除订单表中2007年2月1日以前的行,代码为:
DataTables("订单").DeleteFor("[日期] < #2/1/2007#")
RemoveFor
移除符合条件的行。
所谓移除行,只是让用户再也看不到这些被移除的行,就像这些行从来没有被加载过一样;移除行从来都不会真正从文件中删除行,重新打开文件后,被移除的行将再次出现。
语法:
RemoveFor(Filter)
Filter: 指定移除条件。
请参考表达式的运算符和函数和条件表达式。
例如:
DataTables("订单").RemoveFor("[产品] = 'PD01'
ReplaceFor
找出符合条件的行,并将指定列的内容替换为指定值。
语法:
ReplaceFor(DataColName,Value,Filter)
DataColName:替换的列
Value:替换值
Filter:替换条件,请参考表达式的运算符和函数和条件表达式。
例如将订单表中,订购数量大于600的订单的折扣设为0.15,只需简单的一行代码即可:DataTables("订单").ReplaceFor("折扣", 0.15, "[数量] > 600")
如果不用ReplaceFor,最精简的代码也是:
For Each dr As DataRow in DataTables("订单").Select("[数量] > 600") dr("折扣") = 0.15
Next
RejectChanges
撤销自打开文件或最近一次保存以来,对该表做出的修改。
示例
撤销对表A的修改:
DataTables("表A").RejectChanges()
StopRedraw
我们对表做的任何变动,例如编辑数据、增加行、删除行、调整行高列宽,都会导致Table 重新绘制,以便显示变动后的结果。
如果要对DataTable连续地进行大量的操作,为了避免相关Table(表)不停地闪烁,可以先执行StopRedraw方法禁止绘制表,操作完成后再执行ResumeRedraw方法重新绘制表。
StopRedraw方法会禁止绘制所有基于该DataTable的Table,直到执行ResumeRedraw方法恢复绘制。
例如我们要在订单表中增加500行,代码如下:
With DataTables("订单")
.StopRedraw
For i As Integer = 1 To 500
.AddNew()
Next
.ResumeRedraw
End With
注意最后一定要记得执行ResumeRedraw方法,否则表格不会再刷新。
如果你将代码修改为:
With DataTables("订单")
For i As Integer = 1 To 500
.AddNew()
Next
End With
你可以看到代码执行过程中会不停地闪烁,而且执行速度也比之前慢很多。
StopRedraw和ResumeRedraw必须配对执行,如果执行了两次StopRedraw,那么对应的就必须执行两次ResumeRedraw,才会恢复绘制Table。
上面的代码只是用于演示,实际上增加500行最简单的代码是:
DataTables("订单").AddNew(500)
属性
下表的属性和方法可以暂时忽略,这些是和动态加载相关的属性和方法,将在《动态加载》
关于DataTables
前面我们已经通过DataTables集合,引用指定名称的DataTable,例如:
DataTables("产品").Save()
DataTables("订单").AllowEdit = False
既然是集合,我们就可以通过For Each语句遍历集合中所有元素。
例如下面的代码,列出所有DataTable的名称:
For Each dt As DataTable In DataTables
Output.Show()
Next
DataTables的属性:
Count
用于返回DataTable的数量。
AllowEdit
是否允许编辑数据。
默认为True,如果将此属性设为False,将锁定所有DataTable,相当于单击菜单中的“查阅模式”按钮。
例如:
Output.Show("总表数:" & DataTables.Count)
DataTables.AllowEdit = False '锁定所有表,进入查阅模式
DataTables.AllowEdit = True
只有DataTables和DataTable的AllowEdit属性都为True的情况下,我们才能够在DataTable中输入数据。
DataTables的方法:
Save
保存所有表,等同于单击菜单中的“保存”按钮。
Contains
判断是否存在指定名称的DataTable,如果存在,则返回True,否则返回False
RejectChanges
撤销自打开文件或最近一次保存以来的全部修改。
Load
加载表,这个方法的使用会在动态加载这一章进行介绍
Unload
卸载表,这个方法的使用会在动态加载这一章进行介绍
例如:
DataTables.Save() '保存所有表
If DataTables.Contains("统计表1") '如果存在统计表1
MessageBox.Show("此表已经存在")
End If
二,DataCols
DataCols
通过DataCols集合,可以引用指定名称的列,例如:
DataTables("订单").DataCols("数量")
返回订单表的数量列。
既然是集合,我们就可以通过For Each语句遍历集合中所有元素。
例如执行下面的代码,可以列出订单表中所有列的名称:
For Each dc As DataCol In DataTables("订单").DataCols
Output.Show()
Next
通过DataCols的Count属性,可以返回总的列数。
下面代码列出所有表的列数和列名称:
For Each dt As DataTable In DataTables
Output.Show( & "包括以下列:" )
For Each dc As DataCol In dt.DataCols
Output.Show(" " & )
Next
Output.Show("总列数:" & dt.DataCols.Count)
Next
DataCols包括三个方法:
利用Add方法,可以增加临时列,并可给临时列设置表达式。
通过代码增加的临时列,在重新打开项目文件后,将不复存在。
Add方法的语法有六个:
Add(ColumnName, GetType(Type))
Add(ColumnName, GetType(Type), Expression)
Add(ColumnName, GetType(Type), Expression, Caption)
Add(ColumnName, GetType(Type), MaxLength)
Add(ColumnName, GetType(Type), MaxLength, Expression)
Add(ColumnName, GetType(Type), MaxLength, Expression, Caption)
后三个语法是针对字符列的。
参数说明:
Name
新增列的名称
Type
新增列的数据类型,需要配合GetType关键字来获得数据类型,例如GetType(String)表示字符型,GetType(Boolean)表示逻辑型。
Expression
可选参数,指定新增列的计算表达式。
有关表达式的常识和语法,请参考应用篇中和表达式相关的章节,有非常详细的介绍。
MaxLength
可选参数,用于指定字符列的长度,超过255将作为备注型。
Caption
可选参数,用于设置列标题。
例如:
DataTables("订单").DataCols.Add("金额", GetType(Double), "[数量] * [单价] * (1 - [折扣])")
有了Add方法,表达式列可以不通过菜单,而是在运行的时候通过代码动态添加,这样可提供更好的灵活性。
通过Add方法增加的临时列,可以用Delete方法删除。
例如:
If DataTables("订单").DataCols.Contains("金额") Then
DataTables("订单").DataCols.Delete("金额")
End If
属性
DataCols
通过DataCols集合,可以引用指定名称的列,例如:
DataTables("订单").DataCols("数量")
返回订单表的数量列。
既然是集合,我们就可以通过For Each语句遍历集合中所有元素。
例如执行下面的代码,可以列出订单表中所有列的名称:
For Each dc As DataCol In DataTables("订单").DataCols Output.Show()
Next
通过DataCols的Count属性,可以返回总的列数。
下面代码列出所有表的列数和列名称:
For Each dt As DataTable In DataTables
Output.Show( & "包括以下列:" )
For Each dc As DataCol In dt.DataCols
Output.Show(" " & )
Next
Output.Show("总列数:" & dt.DataCols.Count)
Next
通过代码增加的临时列,在重新打开项目文件后,将不复存在。
Add方法的语法有六个:
Add(ColumnName, GetType(Type))
Add(ColumnName, GetType(Type), Expression)。