当前位置: 代码迷 >> PB >> 怎么用pb做一个类似百度搜索框的下拉列表框
  详细解决方案

怎么用pb做一个类似百度搜索框的下拉列表框

热度:78   发布时间:2016-04-29 05:35:00.0
如何用pb做一个类似百度搜索框的下拉列表框?
环境:pb11.5+oracle11g
需求:如图 


实例需求:
输入拼音字头或者汉字时,下拉列表展开,并显示模糊查询出来的数据,如下表记录,在下拉列表的编辑框输入W(无论大小写)或者‘王’,列表显示王五,王文龙,并且可以用键盘上、下方向键选择相应数据后回车执行selectionchanged事件

表 EMPLOEE 字段.E_NAME//姓名,
                input_code//拼音字头输入码 
记录如下:
王五 WW
王文龙 wWL
赵六 ZL
张三 zs 
。。。
数据窗口d_name:
SELECT EMPLOEE.E_NAME  
    FROM EMPLOEE  
   WHERE EMPLOEE.input_code like  UPPER(:inputcode)||'%' 
      or EMPLOEE.e_name like  :ename||'%'
order by E_NAME
//我的方法,不知失败在哪里?
窗口:
声明shared变量:sele_modi,cx_mc
在所在窗口的Open事件中编写script为:
string inputcode
inputcode=''
datastore db1_ds
db1_ds=create datastore
db1_ds.dataobject='d_name'
db1_ds.settransobject( sqlca)
db1_ds.retrieve(UPPER(ddlb_1.text) )
long ll_row,ll_total
ll_total=db1_ds.rowcount()
if ll_total<=0 then
destroy(db1_ds)
return
end if
for ll_row=1 to ll_total
ddlb_1.additem(db1_ds.getitemstring(ll_row,1))
end for
destroy(db1_ds)

在下拉列表控件ddlb_1的selectonchenge事件中编写script为 :
sele_modi=true

在下拉列表控件ddlb_1的Modified事件中编写script为 :
 cx_mc=ddlb_1.text 
long in_pos  
boolean empty_ddlb=false 
if not (sele_modi ) then   
string select_str,inputcode   
long ad_count    
ad_count=totalitems(ddlb_1)   
inputcode=trim(ddlb_1.text)   
do while ad_count>=0
     ddlb_1.selectitem(ad_count)    
select_str=ddlb_1.text     
in_pos=pos(select_str,inputcode)  
if in_pos<>0  then    
empty_ddlb=true   
else   
deleteitem(ddlb_1,ad_count)   
end if       
//
ad_count=totalitems(ddlb_1)   
inputcode=trim(ddlb_1.text)
//
loop    
if empty_ddlb=false then    
messagebox('提示信息','没有满足条件的数据,请重新输入')  
string cx_inputcode,ename
inputcode=UPPER(this.text)
datastore db1_ds
db1_ds=create datastore
db1_ds.dataobject='d_name'
db1_ds.settransobject( sqlca)
db1_ds.retrieve(cx_inputcode,ename)
long ll_row,ll_total
ll_total=db1_ds.rowcount()
if ll_total<=0 then
destroy(db1_ds)
return
end if
for ll_row=1 to ll_total
this.additem(db1_ds.getitemstring(ll_row,1))
end for
destroy(db1_ds)   
ddlb_1.text=""   
setfocus(ddlb_1)   
else     
ddlb_1.showlist=true  
ddlb_1.text=""   
setfocus(ddlb_1)   
end if 
end if  
sele_modi=false 
//下拉列表可以显示所有记录,编辑框输入字符脱离焦点就死循环了。
------解决方案--------------------
可以考虑用DDDW+setfilter去实现,这样循环插值删值效率感觉很低啊,呵呵


------解决方案--------------------
如果数据量不太大的话,建议你用setfilter来实现,效果比较好,如果数据量超过10万,建议你用检索来实现
  相关解决方案