当前位置: 代码迷 >> PB >> pb9怎么实现ddlb下拉模糊搜索提示
  详细解决方案

pb9怎么实现ddlb下拉模糊搜索提示

热度:168   发布时间:2016-04-29 09:16:06.0
pb9如何实现ddlb下拉模糊搜索提示
有点像百度,比如输入“北京”,会出现一个下拉,显示一些北京相关的提示给你选择

------解决方案--------------------
open事件:
DataWindowChild ldw_show
dw_1.getchild('列名',ldw_show)
ldw_show.settransobject(sqlca)
ldw_show.retrieve()
dw_1的itemchanged事件:
ldw_show.SetFilter(format1)
ldw_show.Filter()


------解决方案--------------------
楼上的可行
------解决方案--------------------
不可以
------解决方案--------------------



数据窗口中实现增量查询













(独孤求败二零零四年一月十五日整理于深圳市南山区)



先来了解以下什么是数据窗口的增量查询功能。数据窗口的增量查询是针对于数据窗口的某一列而言,假设一个窗口中有单行编辑器和数据窗口两个控件,在单行编辑器控件中每输入一个字符,数据窗口就能找到这一列值左边部分与单行编辑器中内容相符合的行,并高亮度显示。例如数据窗口是按整型字段“ID”升序排列的,用户在单行编辑器中输入“1”,则数据窗口滚动到ID字段第一位为“1”的第一行并高亮度显示,再在“1”后面输入“0”,则数据窗口滚动到ID字段前两位为“10”的第一行,依此类推。
增量查询功能实现的关键有两点:一是单行编辑器控件能实时响应键盘的输入,捕捉每一个按键,获得其中的文本;二是数据窗口的模糊查询的功能,即能够找到列ID左边文本与单行编辑器文本相等的行,这可以用“like”来匹配。
具体操作步骤如下:
1、建立一个工作空间(workspace),取名为:zlcx。

2、建立一个应用(application),取名为:zlcx。

3、建立一个Standard Visual UserObject,基类为单行编辑器SingleLineEdit,取名为:uo_zlcx。

4、定义uo_zlcx的用户事件ue_enchange,Event ID:pbm_enchange,用于响应键盘的输入。

5、为uo_zlcx定义一个对象级函数,uf_zlcx(datawindow adw_name,string as_column) return (none)
//增量查询
//参数:adw_name 数据窗口名
// as_column 查询的列名
long ll_found_row
string ls_find
//查找条件(左部分与单行编辑器文本相等)
ls_find = "string(" +as_column + ") like " + "'" + this.text + "%'" 
//查找符合条件的行
ll_found_row = adw_name.Find(ls_find, 1, adw_name.RowCount()) 
if ll_found_row <= 0 then return 
//滚动到相匹配的行
adw_name.ScrollToRow(ll_found_row) 
adw_name.SelectRow(0 , false)
//将匹配行加亮显示
adw_name.SelectRow(ll_found_row , true)

6、调用方法
新建立一窗口,内置一数据窗口控件dw_1和一用户对象控件sle_1(由uo_zlcx继承而来),并将dw_1和数据窗口对象关联。假设查询的列名为“ID”,则在sle_1的ue_enchange事件编写如下脚本:
this.uf_zlcx( dw_1, 'id')
运销效果图如下:
1)、在单行编辑器中输入“2”的效果图。
 
2)、再输入一个“2”的效果图。
 

------解决方案--------------------
探讨
这个可不可以在输入的同时显示下拉呢?

------解决方案--------------------
楼上的正解。
------解决方案--------------------
用Key相关事件恐怕不太可行,很难进行汉字模糊匹配。
------解决方案--------------------
2楼正解,可以用DDDW的EditChanged事件来做
------解决方案--------------------
integer li_searchtextlen //查询字符长度
integer li_searchindex //查找到的索引
string ls_searchtext //输入的text
string ls_foundtext //找到的text
boolean lb_keyback //返回
boolean lb_keydel //删除
messagebox("",this.text)

lb_keyback = KeyDown(KeyBack!)
lb_keydel = KeyDown(KeyDelete!)
 

ls_searchtext = this.text 
li_searchtextlen = Len (ls_searchtext)
 

If li_searchtextlen <=0 Or lb_keyback Or lb_keydel Then Return
li_searchindex = this.FindItem (ls_searchtext, 0)
if li_searchindex > 0 then
ls_foundtext = this.Text (li_searchindex)
this.text = ls_foundtext
if li_searchtextlen = len(ls_foundtext) THEN
this.SelectText (Len (ls_foundtext)+1, 0)
else
this.SelectText (li_searchtextlen + 1, Len (ls_foundtext))