以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  下拉窗口问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=97430)

--  作者:cuicuibing
--  发布时间:2017/3/12 10:53:00
--  下拉窗口问题
使用DropDownForm,设计字段的下拉窗口按照

一、设计下拉窗口

1、首先在订单表新增一个窗口,名称为"窗口1",窗口类型为"DropDownForm",窗口插入一个Table控件,Table控件的“作为副本”属性设置为True,“允许编辑”属性设置为False,并绑定到客户表。

2、将窗口的DropDownOpened事件代码设置为:

Dim txt As String = e.Form.DropDownBox.Text
Dim
tbl As Table = Tables("窗口1_Table1")
If
txt = "" Then
   
tbl.Filter = ""
Else

    txt =
"\'%" & txt & "%\'"
    tbl.Filter =
"客户ID Like " & txt & " Or 公司名称 Like " & txt & " Or 地址 Like " & txt & " Or 联系人 Like " & txt
End
If
e.Form.DropDownBox.
Select()
\'将输入焦点返回下拉列表框

这样下拉窗口显示后,会自动根据下拉列表框的内容,筛选出可能的客户,并将输入焦点返回到下拉列表框。

3、将Table控件的DoubleClick事件代码设置为:

Forms("窗口1").DropDownBox.CloseDropDown()

这样在下拉窗口双击某个客户,就会关闭下拉窗口。

4、将Table控件的KeyDown事件代码设置为:

If e.KeyCode = Keys.Enter Then
    Forms(
"窗口1").DropDownBox.CloseDropdown()
End
If

这样在下拉窗口中选择某个客户,按回车键,也会关闭下拉窗口。

5、将窗口的DropDownClosed事件代码设置为:

If e.Selected Then \'如果选择了值
    Dim tbl As Table = Tables("窗口1_Table1")
    If
tbl.Current IsNot Nothing
Then
        e.Form.DropDownBox.Value = tbl.Current(
"客户ID")
    End
If
End If

这样关闭下拉窗口后,可以自动将选定客户的客户ID输入到下拉列表框中。

如果除了客户ID列,还要同时从客户表选择其它多列内容输入到订单表,可以将DropDownClosed事件代码改为:

If e.Selected Then \'如果选择了值
    Dim tbl As Table = Tables("窗口1_Table1")
    If
tbl.Current IsNot Nothing
Then
        e.Form.DropDownBox.Value = tbl.Current(
"客户ID")
       
Tables("订单").Current("其它列1") = tbl.Current("其它列1")
        Tables("订单").Current("其它列2") = tbl.Current("其它列2")
        Tables("订单").Current("其它列3") = tbl.Current("其它列3")
    End
If
End If

二、设计订单表事件代码

下拉窗口设计完成,现在设计订单表的事件代码。

1、将订单表的KeyPressEdit事件代码设置为:

If e.Col.Name = "客户ID" Then \'如果编辑的是客户ID列
    If e.Col.DroppedDown = False \'且下拉窗口没有打开
        e.Col.OpenDropDown()
\'打开下拉窗口
   
End If
End
If

这样一旦用户在订单表的客户ID列输入内容,就会自动打开下拉窗口。

2、将订单表的ChangeEdit事件代码设置为:

If e.Col.Name = "客户ID" Then \'如果编辑的是客户ID列
    If e.Col.DroppedDown Then \'如果下拉窗口已经打开
       
Dim tbl As Table = Tables("窗口1_Table1")
        If
e.Text = "" Then
\'如果内容为空
            tbl.Filter = ""
\'显示所有客户
       
Else \'否则根据输入内容进行模糊筛选
           
Dim txt As String = "\'%" & e.Text & "%\'"
            tbl.Filter =
"客户ID Like " & txt & " Or 公司名称 Like " & txt & " Or 地址 Like " & txt & " Or 联系人 Like " & txt
        End
If
   
End If
End
If

这样就能根据用户在客户ID列输入的内容,动态筛选出可能的客户。

3、将订单表的KeyDownEdit事件代码设置为:

If e.Col.Name = "客户ID" Then \'如果编辑的是客户 ID列
   
If e.Col.DroppedDown Then \'如果下拉窗口已经打开
       
Dim tbl As Table = Tables("窗口1_Table1")
        If
e.KeyCode = Keys.Up Then
\'如果按下的是上箭头按键
            tbl.Position = tbl.Position - 1
\'向上移动一行
            e.Cancel =
True
       
ElseIf e.KeyCode = Keys.Down Then \'如果按下的是下箭头按键
            tbl.Position = tbl.Position + 1
\'向下移动一行
            e.Cancel =
True
       
End If
   
End If
End
If

这样用户在客户ID列输入内容的时候,可以按"上箭头"按键,选择上一个客户,按"下箭头"按键,选择下一个客户。

4、将订单表的ValidateEdit事件代码设置为:

If e.Col.DroppedDown Then \'如果下拉窗口已经打开
    e.Col.CloseDropDown()
\'则关闭下拉窗口
End If

这样用户在编辑过程中,按Tab键离开单元格的时候,能自动关闭下拉窗口

5、最后在项目事件AfterOpenProject事件中加入代码:

Tables("订单").Cols("客户ID").DropForm = "窗口1"



取值后, 保存后。点击别的数据,显示集合已修改;可能无法执行枚举操作。我的窗口中,有几个table,是通过点击另一个table加载的数据。

[此贴子已经被作者于2017/3/12 11:10:49编辑过]

--  作者:有点色
--  发布时间:2017/3/12 20:20:00
--  
 上传具体例子测试。