综合示例

本示例请参考CaseStudy目录下的示例文件“自动输入.Table”。

假定项目中有一个名为“行政区域”的基础数据表,这个表已经输入了全国所有县级行政区域的资料,包括省市、市县、区号、邮编四列;现在我们在客户表中输入数据,假定客户表也有这么四列,显然最好的输入方式是,客户表省市列能够根据行政区域表的设置,列出所有的省市供选择,选择省市之后,市县列能列出该省市所有的市县供选择,而选择市县之后,区号和邮编能够自动输入。

一、先在项目事件AfterOpenProject中设置如下代码:

'从行政区域表提取省市列的内容, 作为客户表省市列的列表项目
Tables
("客户").Cols("省市").Combolist = DataTables("行政区域").GetComboListString("省市"
)

我们不在表事件PrepareEdit中设置客户表“省市”列的列表项目,而是在项目事件AfterOpenProject中设置,是因为省市的列表项目是固定的,如果在PrepareEdit事件中设置,每选择一个单元格都会重新设置一次列表项目,显然是没有必要的。

二、在客户表的PrepareEdit事件中输入如下代码:

If e.IsFocusCell Then '如果是焦点所在单元格
   
If e.Col.Name = "县市" Then '如果正在编辑的是县市列
    
    '从行政区域表提取该省 市的县市作为列表项目
        e.Col.Combolist =
DataTables("行政区域").GetComboListString("县市", "[省市] = '" & e.Row("省市") & "'")
   
End If
End
If

再次强调,动态列表项目是针对正在输入的焦点单元格,所以一定要用IsFocusCell判断触发事件的是否是焦点单元格,因为在表中进行剪切、粘贴的时候,会针对每一个可能会受影响的单元格触发PrepareEdit事件,如果你在县市列复制粘贴1000行数据,那么就会触发一千次PrepareEdit事件, 如果不加判断,就等于要执行一千次GetComboListString,这可能需要一个漫长的执行过程。

三、客户表的DataColChanged事件中输入如下代码:

'如果刚刚输入的是省市或县市列
If
e.DataCol.Name = "省市" Orelse e.DataCol.Name = "县市" Then
    Dim
dr As DataRow
   
Dim Filter As
String
    Filter = "[省市] = '" & e.DataRow("省市") & "' And [县市] = '" & e.DataRow("县市") & "'"
    dr = DataTables("行政区域").Find(
Filter) '在行政区域表查找所输入省市和县市的行
    If
dr IsNot Nothing Then '如果找到
        '将找到行的区号和邮编内容填入到正在输入的行中

        e.DataRow("区号") = dr("区号")
        e.DataRow("邮编") = dr("邮编")
    Else
       
'否则清除区号和邮编两列的内容
        e.DataRow("区号") = Nothing
        e.DataRow("邮编") = Nothing
    End
If
End
If


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