| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2664 人关注过本帖, 1 人收藏
标题:TextBox+ListBox组成的MyComboBox控件
只看楼主 加入收藏
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
这种“文本框+列表框”的设计我已应用多年,下面说一下我的一点应用体会:

1. 当列表框中的条目不多时,列表框随输入框的内容动态定位没有问题,但当列表框的条目很多时,这种设计就有缺陷。试想:每按一下键就要等待若干秒,用户体验会很差。我的方案:当用户在文本框中按下回车键时,才执行列表框定位操作,同时焦点也不离开文本框,便于用户继续输入。文本框的 KeyPress 代码如下:
程序代码:
IF nKeyCode = 13
    NODEFAULT
    SELECT 表1
    cText = ALLTRIM(THIS.Text)
    IF SEEK(cText)
        THIS.Parent.lstItem.Value = 字段1
    ENDIF
ENDCASE
2. 在实际应用中,表字段作为列表框的数据来源的情况较多,在表中查找记录要比遍历列表框的每个条目速度要快,特别是对表采用索引查找时。我一般都是先用 Seek 命令定位记录,然后再将表字段的值赋于列表框的 Value 来刷新列表框(见上面的 KeyPress 代码)。
3. 既然在文本框中按回车键执行的是列表框定位操作,那么只能按 TAB 键将焦点移动到下一个控件了,这也是 Windows 的默认按键。
4. 当焦点离开文本框时,若输入的内容在列表框中不存在,应该给出提示并阻止用户离开焦点。同时,若用户仅输入了内容的前半部分,应该将其余内容补齐。文本框的 Valid 事件代码:
程序代码:
LOCAL cText
cText = ALLT(THIS.Value)
IF EMPTY(cText)
    RETURN
ENDIF
SELECTIF SEEK(cText)
    THIS.Value = 字段
    THIS.Parent.lstItem.Value = 字段
ELSE
    MESSAGEBOX('物料代码输入有误!',48,'提示')
    THIS.Value = ''
    RETURN 0
ENDIF
5. 列表框有一个缺陷:列表框为活动控件时,按回车键,焦点并不会移动到下一个控件,这对于喜欢输入数据后按回车键的用户来说,可能不习惯。解决方法:在列表框的 KeyPress 事件中输入如下代码:
IF nKeyCode = 13
    KEYBOARD '{TAB}'
ENDIF


[此贴子已经被作者于2015-12-2 10:50编辑过]


泉城飞狐
2015-12-02 10:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
大規模和複雜的數據查詢是不會選用ComboBox這類界面的。

授人以渔,不授人以鱼。
2015-12-02 11:25
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 32楼 TonyDeng
我觉得这种应用对于大数据也是有用的。举一个应用实例:

拿我们最常使用的输入材料代码功能来说吧。材料代码一般采用“分类+序号”的方式。大的分类代码一般都能记住,如:1 表示钢材,2 表示组部件,3 表示绝缘材料,4 表示有色金属,5 表示油漆化工,6 表示国标件……,但小分类和序号记不住。这时,我们输入材料代码时,仅输入前面的大分类,然后回一下车,列表框就直接定位到该分类的第一条记录,然后再从列表中选择具体的材料。我认为,这是最快捷的方式。当然,还应该在旁边添加一个按钮,单击该按钮可打开材料字典窗口,以便用户从材料树中选择材料或添加新材料。

经过多年的积累,我们的材料库有 3 万多条记录。如果采用动态定位,则有明显的延迟。

泉城飞狐
2015-12-02 11:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 33楼 liuxingang28
從我的類中派生子類,重載篩選方法即可,那個列表框的數據源是可以在外部改變的,主動調用init方法,檢索的辦法就用你說的那些。我也是用你說的這些,不過會設計一個專用的檢索界面,數據顯示部件用grid而不是listbox。

授人以渔,不授人以鱼。
2015-12-02 15:44
asdf_123000
Rank: 4
等 级:业余侠客
威 望:1
帖 子:273
专家分:227
注 册:2012-12-20
收藏
得分:0 
学习
2015-12-12 13:59
wj470399276
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-1-14
收藏
得分:0 
下拉用grid控件筛选,那个快
2016-01-15 17:25
tack
Rank: 1
等 级:新手上路
帖 子:24
专家分:3
注 册:2015-12-22
收藏
得分:0 
以下是引用sdta在2015-11-30 13:10:20的发言:

    PROCEDURE lstList.MouseWheel(tnDirection, tnShift, tnXCoord, tnYCoord)
        WITH This
            IF tnDirection < 0
                IF .ListIndex < .ListCount
                    .ListIndex = .ListIndex + 1
                ENDIF
            ELSE
                IF .ListIndex > 1
                    .ListIndex = .ListIndex - 1
                ENDIF
            ENDIF
        ENDWITH
        this.Parent.txtInput.SetFocus
    ENDPROC

鼠标单击后,怎么返回list的值能text?谢谢。
2016-09-07 23:44
快速回复:TextBox+ListBox组成的MyComboBox控件
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030595 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved