Rss & SiteMap
Foxtable(狐表) http://www.foxtable.com
表A:
星期 |
正课 |
辅导 | |
2009.11 |
星期一 |
3 |
3 |
2009.11 |
星期二 |
4 |
3 |
2009.11 |
星期三 |
4 |
3 |
2009.11 |
星期四 |
5 |
4 |
2009.11 |
星期五 |
3 |
4 |
2009.11 |
星期六 |
3 |
5 |
2009.11 |
星期日 |
4 |
5 |
'生成"课时名单"表
Dim ksmd As New DataTableBuilder("课时名单")
ksmd.AddDef("姓名", GetType(String), 15)
ksmd.AddDef("星期", GetType(String), 15)
ksmd.AddDef("计分", GetType(Integer))
ksmd.TableVisible = false
ksmd.Build()
'生成"课时名单"数据
Dim Values() As String
Dim n As Integer = Tables("课程表").rows.count
Dim n1 As Integer
for Each dc as Datacol in DataTables("课程表").Datacols
if dc.name <> "班级" Then
n1 = n1 +1
dim f As New Filler
f.SourceTable = DataTables("课程表") '指定数据来源
f.SourceCols = dc.name '指定数据来源列
f.DataTable = DataTables("课时名单") '指定数据接收表
f.DataCols = "姓名" '指定数据接收列
f.Distinct = false
f.Fill() '填充数据
Values = dc.name.split("_")
For i As integer = (n*n1)-n to Tables("课时名单").rows.count -1
Tables("课时名单").Rows(i)("星期") = Values(0)
Tables("课时名单").Rows(i)("计分") =e.Form.Controls(Values(0)).Value
Next
end if
Next
记住了,谢谢老师指点。复习一下帮助中相关知识:
Find
在DataTable查找符合条件的行,如果找到的话,返回找到的行,否则返回Nothing。
如果有多个符合条件的行,默认返回第一个,也可以指定返回第几个符合条件的行。
语法:
Find(Filter,Sort,Index)
Filter: 条件表达式,请参考表达式的运算符和函数
Sort: 可选参数,指定排序方式。
Index: 可选参数,指定返回第几个符合条件的行。
示例一:
Dim
dr As DataRow实例二:
有的时候,我们需要查找倒数第几行数据,例如最近一次订购某某产品的记录。
可以参考下面的代码:
Dim
dr As DataRow可以看到代码和原来几乎一样,唯一的变化是排序参数,被改为:日期 Desc
加上DESC使得日期按照降序排序,最后的日期排在最前面,我们所找出的第一条记录,就是最后一次订购产品PD01的记录。
示例三
通常应该在在代码中判断是否找到了符合条件的行,然后再运行后续的代码。
例如要找出最近一次订购产品数量超过1000的订单,并显示订单的日期和客户:
Dim
dr As DataRow如果我们不加上判断,直接:
Dim
dr As DataRow一旦订单表并不存在订购数量超过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)再例如,希望列出1999年1月4日订购PD01的客户,按订购的数量排序:
Dim
drs As List(Of DataRow)下面是一个典型的应用,在一个成绩表中,包括班级、姓名、总分、总分排名几列数据,希望按班级自动生成总分排名:
'获得所有班级名称,保存在集合中
Dim bjs As List(Of String) = DataTables("成绩表").GetUniqueValues("","班级")
For Each bj As String In bjs
'获得该班级的全部行,按总分降序排序
Dim drs As List(Of DataRow) = DataTables("成绩表").Select("[班级] = " & bj, "总分 DESC")
For n As integer = 0 To drs.Count - 1 '遍历所有行
If n > 0 AndAlso drs(n)("总分") = drs(n-1)("总分") Then '如果总分和上一行相同
drs(n)("总分排名") = drs(n-1)("总分排名") '则排名等于上一行
Else
drs(n)("总分排名") = n + 1 '设置排名
End If
Next
Next
上面的例子,可以参考CaseStudy目录下的文件:成绩排名.Table