-- 作者:狐狸爸爸
-- 发布时间:2009/6/7 15:42:00
--
考虑分组行
尽管实际编写代码的时候,要处理分组行的情况很少,但是我们还是介绍一下用代码处理分组行的方法。
前面提到,在汇总模式下,Rows集合在返回指定位置的行的时候,是不考虑分组行的。 如果要包括分组行,可以给Rows加上一个参数True,例如:
Dim r As Row = Tables("订单").Rows(2, True)
为了测试这种特性,我们首先让订单表进入汇总模式:
此主题相关图片如下:1040.gif
然后在命令窗口执行下面的代码:
Dim r1 As Row = Tables("订单").Rows(2) Dim r2 As Row = Tables("订单").Rows(2,True) Output.Show("r1: " & r1("产品")) Output.Show("r2: " & r2("产品"))
执行结果:
r1: PD01 r2: CS02 小计
可以看出Rows(2)本来应该返回第三行,但是因为第三行是分组行,所以被排除在外,实际返回的是第四行,也就是第三个数据行。 Rows(2,True)在计算行位置的时候,包括了分组行,所以返回的是第三行数据,尽管第三行是分组行。
Rows的Count属性返回总的行数,同样默认是不包括分组行的,如果要包括分组行,可以给Count加上一个参数True,例如:
Dim c1 As Integer = Tables("订单").Count Dim c2 As Integer = Tables("订单").Count(True) Output.show("c1 = " & c1) Output.show("c2 = " & c2)
在汇总模式下执行上述代码,可以发现c1等于数据行的行数,没有包括分组行;而c2包括了分组行,等于数据行的行数加上分组行的行数,也就是总行数。
Row有一个IsGroup属性,可以判断指定位置的行是否是分组行,例如:
If CurrentTable.Rows(4, True).IsGroup Then Messagebox.Show("第五行是分组行!") End If
显然,在使用IsGroup属性的时候,Rows必须加上参数True,否则返回的永远是数据行,IsGroup的值永远为False,失去了判断的必要性。
下面举个处理分组行的例子,假定需要将分组行数量列的内容,全部除以100:
Dim r As Row With Tables("订单") For i As Integer = 0 To .Rows.Count(True) - 1 \'Count加上参数True r = .Rows(i,True) \'Rows也需要加上参数True If r.IsGroup Then \'如果是分组行 r("数量") = r("数量") /100 End If Next End With
RowSel、TopRow、BottomRow三个属性分表表示当前行位置、选定区第一行位置、选定区最后一行位置;这三个属性和Position、TopPosition、BottomPosition是对应的,不同的是前者前者在计算位置的时候,是考虑分组行的,而后者是不考虑分组行的。实际上RowSel、TopRow、BottomRow三个属性使用的场合非常有限,通常用于Select和Aggregate两个方法,因为只有这两个方法的参数,是考虑分组行的。
例如,我们利用FindRow找出某个符合条件的行后,可以用Position属性定位到这一行,如果我们希望不仅定位到该行,而且定位到该行的某一列,就必须使用Select方法和RowSel属性了。 下面的代码,找出订购产品PD01且数量大于100的行,然后定位到该行的日期列:
With CurrentTable Dim r As Integer Dim p As Integer = .Cols("日期").Index \'获得日期列的位置 r = .FindRow("产品 = \'PD02\' And 数量 > 100", 0, False) If r > - 1 Then \'如果找到符合条件的行 .Position = r \'则选择该行 .Select(.RowSel, p) End If End With
上面的代码不管是汇总模式,还是普通模式,都能正常查找和定位。 如果直接将代码写为:
With CurrentTable Dim r As Integer Dim p As Integer = .Cols("日期").Index \'获得日期列的位置 r = .FindRow("产品 = \'PD02\' And 数量 > 100", 0, False) If r > - 1 Then \'如果找到符合条件的行 .Select(.Position, p) End If End With
在普通模式下,上面的代码没有问题,因为此时Positon和RowSel的值是相等的,但是在汇总模式下,因为Position的值并不一定等于RowSel,所以无法正常定位。
再来看看选定整列的代码,例如选定数量列,之前介绍的代码是:
With Tables("订单") Dim c As Integer= .Cols("数量").Index .Select(0, c, .Rows.Count - 1, c) End With
这个代码是有缺陷的,要保证在汇总模式下也能正常选定这个数量列,代码应该改为:
With Tables( "订单") Dim c As Integer= .Cols("数量").Index .Select(0, c, .Rows.Count(True) - 1, c) End With
Aggregate方法的参数,同样是考虑分组行的,例如要统计当前表选定区域的累积值:
Dim Sum As Double With CurrentTable Sum = .Aggregate(AggregateEnum.Sum, .TopRow, .LeftCol, .BottomRow, .RightCol) End With OutPut.Show(Sum)
[此贴子已经被作者于2009-6-7 15:45:07编辑过]
|