窗口中的动态列表项目
在Foxtable编程部分,我们已经学会了如何在表中实现动态列表项目。
现在我们同样看看如何在窗口中实现列表项目。
本节示例可以参考CateStydy目录下的文件:窗口动态列表项目.table
示例一
假定有一个表:

和下面这样的一个窗口:

希望第一个组合框能够自动列出所有型号供选择,而第二个组合框能够列出所选型号的全部规格供选择,同样第三个组合框能够列出所选规格的全部颜色供选择。
设计的步骤为:
1、在窗口的AfterLoad事件中加入代码:
Dim
 cmb 
As WinForm.ComboBox = 
e.form.Controls("ComboBox1")
cmb.ComboList = DataTables("表A").GetComboListString("型号")
2、在ComboBox2的Enter事件中加入代码:
Dim 
cmb 
As WinForm.ComboBox 
= e.Sender
Dim str As
string = 
e.Form.Controls("ComboBox1").Value
cmb.ComboList = DataTables("表A").GetComboListString("规格",
"型号 = '" & str &
"'")
3、最后在ComboBox3的Enter事件中加入代码:
Dim 
cmb 
As WinForm.ComboBox 
= e.Sender
Dim str As 
String =
e.Form.Controls("ComboBox2").Value
cmb.ComboList 
= DataTables("表A").GetComboListString("颜色",
"规格 = '"
& 
str &
"'")
示例二
假定组合框的列表项目并非动态的,随着应用的深入,这些列的列表项目可能会需要调整,虽然通过窗口设计,可以方便地重新设置列表项目。但是对于一个已经交付使用的系统来说,开放窗口设计功能给最终用户,是一个非常危险的做法。有没有安全一些的做法呢?有,通用的做法是:
1、新建一个表(假定表名为项目),包括三列,分别是表、列、列表项目,用于输入某表某列的列表项目:

2、将组合框的Enter事件代码设为:
Dim
 cmb 
As WinForm.ComboBox = 
e.Sender
If cmb.Items.Count > 
0 
Then 
'如果已经设置了项目
    Return
'则返回
End If
Dim t As
Table = 
cmb.BindTable '获得绑定的Table
Dim c As 
Col = cmb.BindCol '获得绑定的Col
Dim dr As
DataRow = 
DataTables("项目").Find("[表] 
= '" & t.Name & "' 
And [列] = '" & c.Name & 
"'")
If dr IsNot Nothing
Then 
'如果在项目表找到对应的行
    cmb.Combolist = dr("列表项目")
'则设置列表项目
End 
If
代码原理很简单,根据代码注释,大家应该都能理解。
一个窗口可能有很多个组合框,针对每个组合框重复设置这样的代码,显得太累赘,为此我们可以使用窗口的全局事件Enter,这样只需设置一次即可。但是全局事件对所有类型的控件有效,而我们的代码是针对组合框的,即使是组合框,也不见得都要执行上述代码。我们可以利用控件名称进行标识,例如对于需要执行上述代码的组合框,名称统一用字符"_cmb"开始,这样只需将全局事件Enter设为:
If 
e.Sender.Name.SubString(0,4) 
= "_cmb" 
Then '如果名称符合
    Dim 
cmb As 
WinForm.ComboBox = e.Sender
    If 
cmb.Items.Count > 0
Then 
'如果已经设置了项目
        
Return '则返回
    End
If
    Dim t 
As 
Table = cmb.BindTable
'获得绑定的Table
    Dim 
c As Col = 
cmb.BindCol '获得绑定的Col
    Dim 
dr As 
DataRow = 
DataTables("项目").Find("[表] 
= '" & t.Name & "' 
And [列] = '" & c.Name & 
"'")
    If 
dr IsNot Nothing
Then 
'如果在项目表找到对应的行
        cmb.Combolist = dr("列表项目")
'则设置列表项目
    End
If
End 
If
    
本页地址:http://www.foxtable.com/webhelp/topics/1523.htm