CurrentTableChanged
选择不同表后执行,也就是CurrentTable发生变化后执行。
此事件无e参数,这是因为系统变量CurrentTable可以直接返回所选择的表。
如果我们选择不同的主表,会先后触发MainTableChanged和CurrentTableChanged事件,因为此时MainTable和CurrentTable都发生了变化。
如果我们选择一个关联表,那么只会触发CurrentTableChanged事件,因为此时只有CurrentTable发生了变化。
例如将CurrentTableChanged事件代码设为:
If CurrentTable.DataTable.Name = "订单" Then '如果选择的主表是订单表
CurrentTable.Cols("客户").Combolist = DataTables("客户").GetComboListString("公司名称")
End If
这样我们每次选择一个Table,如果这个Table的数据来自于订单表,都会从客户表提取公司名称,作为该表客户列的列表项目。
动态列表项目之二
更多的时候,列表项目来自于某个表中已经输入的记录,例如客户表已经输入所有的客户名称及资料,那么订单表的客户名称列的列表项目,应该自动从客户表的客户名称列提取。
如果列表项目来自于某个表的某一列,而这个表会经常增加删除行;那么可以在项目事件MainTableChanged中设置代码提取列表项目。
例如:
If
MainTable.Name = "订单" Then '如果选择的主表是订单表
Tables("订单").Cols("客户").Combolist = DataTables("客户").GetComboListString("公司名称")
End If
上面的代码从客户表提取公司名称,作为订单表客户列的列表项目,由于经常会增加删除客户,所以我们将上面的代码设置在MainTableChanged事件中,这样每次切换到订单表,就会重新设置订单表客户列的列表项目,保证其内容是最新的。
如果某列的列表项目不仅来自于另一个表,而且要根据其它列已经输入的内容来决定显示那些条目,那么这样的代码就只能设置在表事件PrepareEdit中。
例如:
If
e.IsFocusCell Then '如果是焦点所在单元格
If e.Col.Name = "县市" Then '如果正在编辑的是县市列
'从行政区域表提取该省事的县市作为列表项目
e.Col.Combolist = DataTables("行政区域").GetComboListString("县市", "[省市] = '" & e.Row("省市") & "'")
End If
End If
上面的代码,根据省市列输入的内容,从行政区域表提取该省市的所有县市,作为县市列的列表项目,这种根据另一列内容来刷新新列表项目的代码,必须设置在PrepareEdit事件中。
还有一个最简单的情况,即列表项目来自于某个表的某一列,而这个来源表的内容基本是固定,很少机会增加或删除行,那么可以将代码设置在项目事件AfterOpenProject中。
例如:
Tables("客户").Cols("省市").Combolist = DataTables("行政区域").GetComboListString("省市")
上面的代码从行政区域表提取省市列的内容, 作为客户表省市列的列表项目,由于行政区域是固定的,基本上不需要增加删除行,所以从这个表中提取数据作为列表项目,代码可设置在AfterOpenProject事件中。