Foxtable(狐表)用户栏目专家坐堂 → 窗口动态列表项目例子问题


  共有17122人关注过本帖树形打印复制链接

主题:窗口动态列表项目例子问题

帅哥哟,离线,有人找我吗?
hty4000
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:226 积分:2815 威望:0 精华:0 注册:2008/9/1 15:41:00
窗口动态列表项目例子问题  发帖心情 Post By:2009/8/27 21:24:00 [只看该作者]

请问在窗口动态列表项目例子中,窗口中型号的下拉内容是怎么显示出来的,在窗口管理中并没有看到什么代码,这是怎么做到的?

 回到顶部
帅哥哟,离线,有人找我吗?
blackzhu
  2楼 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:狐仙 帖子:9875 积分:57602 威望:0 精华:15 注册:2008/9/1 9:45:00
  发帖心情 Post By:2009/8/27 21:28:00 [只看该作者]

以下是引用hty4000在2009-8-27 21:24:00的发言:
请问在窗口动态列表项目例子中,窗口中型号的下拉内容是怎么显示出来的,在窗口管理中并没有看到什么代码,这是怎么做到的?

论坛里找一下


 回到顶部
美女呀,离线,留言给我吧!
yangming
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/8/27 21:34:00 [只看该作者]

窗口中的动态列表项目

在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


 回到顶部