处理选定的多行

如果我们选定了一行数据,那么通过Position属性可以得到选定行的位置,通过Current属性,可以直接获得选定的行,即当前行。
如果我们选定了多行,又该如何获得所有选定行的位置,以及选定的是哪些行呢?

Foxtable提供了两个属性,用于批量处理选定的多行

属性名 说明
TopPosition 返回选定区域第一个数据行的位置,如果只选定一行,返回值和Position属性相同。
BottomPosition 返回选定区域最后一个数据行的位置,如果只选定一行,返回值和Position属性相同。

和Position属性一样,这两个属性在计算的时候,均不包括分组行,下图清晰地说明了这种特性 ,记住行号是从0开始编号的:

但是也稍有不同,如果选定区域的第一行是分组行,TopPosition会向下寻找,直到找到一个不是分组行的数据行,然后返回此行的位置;
同样,如果选定区域的最后一行是分组行,
BottomPosition会向上寻找,直到找到一个不是分组行的数据行,然后返回此行的位置。
除非只选定了一行,而且此行恰好是分组行,
TopPosition和BottomPosition属性才会返回-1。
而Position属性不具备上述特性,只要选定的是分组行,就直接返回-1。
下图可以很好地说明这种特性:

这种忽略分组行的处理方式,能大大减少编码的复杂程度,因为我们的代码通常只是处理数据行的,对于分组行是要忽略的。

示例

锁定用户选定的行:

With Tables("订单")
    For
i as Integer = .TopPosition To .BottomPosition
        .Rows(i).Locked =
True
    Next
End
With

上述代码,不管是在汇总模式下,还是普通模式下,都能正常地锁定选定的一行或多行,因为代码能够自动排除分组行。
但是如果当前选定的是一行,而且这一行恰好是分组行,那么Position、
TopPosition、BottomPosition三个属性都返回-1,导致上述代码运行出错。
所以比较完美的代码是:

With Tables("订单")
    If .
TopPosition > -1 Then '如果选定区域包括数据行
        For
i as Integer = .TopPosition To .BottomPosition
            .
Rows(i).Locked
= true
        Next
    End If
End With

注意我们根据TopPosition是否大于-1,来判断选定区域是否包括分组行,其理由前面已经讲述,就不再重复。


本页地址:http://www.foxtable.com/webhelp/topics/1597.htm